1

私はフリーハンドの描画ビューを持っています(ユーザーは指で線を描くことができます)。私は数色しか使用していないので、私が書いた圧縮アルゴリズムを持っています(ローカルネットワークを介して別のiPadに送信したい)が、この単純なものでも、グラフィックスコンテキストからデータを正確に取得できないようですテスト:

//Get the data
UIGraphicsBeginImageContextWithOptions(self.bounds.size, NO, 0.0f);
CGContextRef c = UIGraphicsGetCurrentContext();
[self.layer renderInContext:c];
baseImageView.image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

CGImageRef imageRef = baseImageView.image.CGImage;
NSData *dataToUse = (NSData *)CGDataProviderCopyData(CGImageGetDataProvider(imageRef));

//Reuse the data
CGDataProviderRef provider = CGDataProviderCreateWithCFData((CFDataRef)dataToUse);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGImageRef test = CGImageCreate(width,height,8,32,4*width,colorSpace,
kCGBitmapByteOrder32Big|kCGImageAlphaPremultipliedLast,provider,NULL,false,
kCGRenderingIntentDefault); //I get width and height from another part of the program

imageView.image = [UIImage imageWithCGImage:test];

あるCGImageからデータをコピーして、別のCGImageに挿入しようとしました。ただし、結果はガベージであり、それだけでなく、データをコピーすると何らかの理由でBGRAとして出力されるだけでなく、CGImageCreateはRGBAを必要とします。この往復テストのどこが間違っているのですか?

4

1 に答える 1

2

答えは、データプロバイダーを取得するだけでは不十分であるように見えます。実際に画像をビットマップコンテキストにレンダリングし、そこからデータを取得する必要があります。改訂された方法:

//Get the data
CGImageRef imageRef = baseImageView.image.CGImage;
size_t height = CGImageGetHeight(imageRef);
size_t width = CGImageGetWidth(imageRef);
size_t bufferLength = width * height * 4;
unsigned char *rawData = (unsigned char *)malloc(bufferLength);

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef context = CGBitmapContextCreate(bitmapData, width, height, 8,
4*width, colorSpace, kCGImageAlphaPremultipliedLast);
CGColorSpaceRelease(colorSpace);

CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef);
CGContextRelease(context);

NSData *dataToUse = [NSData dataWithBytes:rawData length:bufferLength];

//Later free(rawData);

データの使用は同じです。

于 2012-05-30T07:43:18.980 に答える