1

iOS 5.1 デバイス用の UIImage テスト パターンを作成しようとしています。ターゲットの UIImageView のサイズは 320x240 ですが、160x120 の UIImage テスト パターンを作成しようとしていました (将来、テスト パターン以外の画像はこのサイズになります)。ボックスの上半分を青、下半分を赤にしたかったのですが、初期化されていないメモリのように見えて、画像の下部が破損しています。コードは次のとおりです。

int width = 160;
int height = 120;
unsigned int testData[width * height];
for(int k = 0; k < (width * height) / 2; k++)
    testData[k] = 0xFF0000FF;   // BGRA (Blue)
for(int k = (width * height) / 2; k < width * height; k++)
    testData[k] = 0x0000FFFF;   // BGRA (Red)

int bitsPerComponent = 8;
int bitsPerPixel = 32;
int bytesPerRow = 4 * width;
CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, &testData, (width * height * 4), NULL);
CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();      
CGBitmapInfo bitmapInfo = kCGImageAlphaNoneSkipFirst;
CGColorRenderingIntent renderingIntent = kCGRenderingIntentDefault;

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

UIImage *myTestImage = [UIImage imageWithCGImage:imageRef];

これは、Stack Overflow の別の例のように見えるはずです。とにかく、テスト パターンのサイズを小さくすると、画像の「破損した」部分が増えることがわかりました。また、「壊れた」部分に赤い線が見えるので、コンポーネントのサイズを台無しにしているようには見えません。私は何が欠けていますか?プロバイダーの何かのように感じますが、わかりません。

ありがとう!

スクリーンショットを追加しました。kCGImageAlphaNoneSkipFirst を設定すると、次のようになります。

AlphaSkipFirst

kCGImageAlphaFirst を使用すると、次のようになります。

ここに画像の説明を入力

4

2 に答える 2

2

ピクセルデータは自動変数に含まれているため、スタックに保存されます。

unsigned int testData[width * height];

このデータが宣言されている関数から戻る必要があります。これにより、関数のスタックフレームがポップされ、他の関数によって再利用され、データが上書きされます。

ただし、画像はスタック上の同じアドレスにあるそのピクセルデータを参照しています。(CGDataProviderCreateWithDataデータをコピーするのではなく、単にそれを参照します。)

修正するには:またはを使用mallocCFMutableDataNSMutableData、ヒープ上のピクセルデータにスペースを割り当てます。

于 2012-03-26T15:58:21.517 に答える
0

画像にはアルファが含まれており、最上位ビット (つまり、画像の「B」部分) をスキップして無視するようにシステムに指示します。代わりに kCGImageAlphaPremultipliedLast に設定してみてください。

編集:

エンディアンを思い出したので、プログラムはおそらく値を逆方向に読み取っていることに気づきました。実際に必要なのは kCGImageAlphaPremultipliedFirst です

于 2012-03-25T23:54:27.000 に答える