UIImage から 2D ピクセル配列を作成しようとしています。その配列を作成した後、UIImage に変換して、2D ピクセル配列データが正しいかどうかを確認しています。 http://i.imgur.com/VsCw3.png このリンクには 2 つの画像があります。一番下のものは、ピクセル データを UIImage に変換した後に取得されます。トップワンは元の画像です。どちらもまったく同じように見えますが、ズームインすると、画像の最後の列にあるはずのピクセルが最初の列に表示されていることがわかりますが、残りのデータは正確です。
// 2D ピクセル配列から取得した画像 (最初の列のデータが不正確)
// 実際の画像
以下は、UIImage をピクセルに、またはその逆に変換するために使用したコードです。私は自分が間違っていることを見つけることができました。この問題を解決するのを手伝ってください。
// UIimage を 2 次元のピクセル マトリックスに変換するコード
CGImageRef inImage = sourceImage.CGImage;
GContextRef cgctx = [self createARGBBitmapContextFromImage:inImage];
//if (cgctx == NULL) { return nil; /* error */ }
size_t w = CGImageGetWidth(inImage);
size_t h = CGImageGetHeight(inImage);
CGRect rect = {{0,0},{w,h}};
unsigned char* data = CGBitmapContextGetData (cgctx);
if (data != NULL) {
// separate out the rgb values of each pixel in each matrix
for(int y=0;y<h;y++)
{
for(int x=0;x<w;x++)
{
int offset = 4*((w*y)+x);
int alpha = data[offset];
int red = data[offset+1];
int green = data[offset+2];
int blue = data[offset+3];
sourceRedMatrix[x][y] = red;
sourceGreenMatrix[x][y] = green;
sourceBlueMatrix[x][y] = blue;
// sourceAlphaMatrix[x][y] = alpha;
}
}
CGContextRelease(cgctx);
if (data)
{
free(data);
}
// 2 次元のピクセル マトリックスから UIImage を取得するコード
for(int y=0;y<h;y++)
{
for(int x=0;x<w;x++)
{
redSourceColor = sourceRedMatrix[x][y];
greenSourceColor = sourceGreenMatrix[x][y];
blueSourceColor = sourceBlueMatrix[x][y];
rawDataSource[byteIndex] = (char) (255); // alpha =255, deliberately set
rawDataSource[byteIndex+1] = (char) (redSourceColor);
rawDataSource[byteIndex+2] = (char) (greenSourceColor);
rawDataSource[byteIndex+3] = (char) (blueSourceColor);
byteIndexSource += 4;
}
}CGContextRef ctx = CGBitmapContextCreate(rawData,w, h, 8, 4 * w, CGColorSpaceCreateDeviceRGB(), kCGImageAlphaPremultipliedFirst);
inImage = CGBitmapContextCreateImage (ctx);
UIImage* updatedSourceImage = [UIImage imageWithCGImage:inImage];
imageView.image = updatedSourceImage;
free(rawData);
free(sourceRedMatrix);*