0

PNG 画像ファイルにピクセルを動的に挿入し、以下のコードを使用して保存したピクセルを変更せずに取得しようとしています。しかし、私はそうすることに成功していません。誰かが問題の場所を指摘するのを手伝ってくれますか? ありがとう。

// Original pixels for debugging only
NSString *sPixels = @"12345678";
const char *cpPixels8 = sPixels.UTF8String;

char *cpPixelsStore = calloc(sPixels.length + 1, 1);
strncpy(cpPixelsStore, cpPixels8, sPixels.length);

unsigned int r,g,b,a;
for(int j = 0; j < sPixels.length; j += 4)
{
    r = cpPixelsStore[j+0];
    g = cpPixelsStore[j+1];
    b = cpPixelsStore[j+2];
    a = cpPixelsStore[j+3];

    printf("r:0x%X g:0x%X b:0x%X a:0x%X\n", r, g, b, a);
}

int width = 2;
int height = 1;
int bytesPerRow = 4 * width;
int bitsPerComponent = 8;
int bitsPerPixel = 32;

CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
CGBitmapInfo bitmapInfo = kCGBitmapByteOrder32Host | kCGImageAlphaLast;
CGColorRenderingIntent renderingIntent = kCGRenderingIntentDefault;

CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, cpPixelsStore, (bytesPerRow * height), NULL);

CGImageRef imRef = CGImageCreate(width, height, bitsPerComponent, bitsPerPixel, bytesPerRow, colorSpaceRef, bitmapInfo, provider, NULL, NO, renderingIntent);

CGDataProviderRelease(provider);

UIImage *imNewTemp = [UIImage imageWithCGImage:imRef];
NSData *datPNG = UIImagePNGRepresentation(imNewTemp);

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *sFile = [documentsDirectory stringByAppendingPathComponent:@"Pic.png"];

[datPNG writeToFile:sFile atomically:YES];

CGImageRelease(imRef);

// Cross verify save
UIImage *imTemp = [UIImage imageWithContentsOfFile:sFile];
NSData *datImagePixels = (__bridge NSData *)CGDataProviderCopyData(CGImageGetDataProvider(imTemp.CGImage));
unsigned char *ucpPixelBytes = (unsigned char *)[datImagePixels bytes];

for(int j = 0; j < datImagePixels.length; j += 4)
{
    r = ucpPixelBytes[j+0];
    g = ucpPixelBytes[j+1];
    b = ucpPixelBytes[j+2];
    a = ucpPixelBytes[j+3];

    printf("r:0x%X g:0x%X b:0x%X a:0x%X\n", r, g, b, a);
}

最初の printf は、作成中にこれを返します: r:0x31 g:0x32 b:0x33 a:0x34 r:0x35 g:0x36 b:0x37 a:0x38

ファイルを保存して取得した後に printf を実行すると、次の出力が得られます: r:0xA g:0xA b:0xA a:0x31 r:0xC g:0xB b:0xB a:0x35

私は翻訳に迷っています。助けてください。

4

1 に答える 1

0

NSData は不変です。NSMutableData オブジェクトが必要な場合は、「mutableBytes」を使用してポインターを取得します。NSMutableData *nData = [NSMutableData dataWithData:datImagePixels];

これで、変更を加えた新しいイメージを作成するためのデータが得られました。Quartz メソッド CGImageCreate() を使用して CGImageRef を取得し、そこから UIImage を取得できます。

于 2012-08-21T23:06:47.050 に答える