我正在尝试从 UIImage 制作一个 2D 像素数组,在制作该数组后,我将其转换回 UIImage 以查看 2D 像素数组数据是否正确。 http://i.imgur.com/VsCw3.png 这个链接有两张图片。底部的一个是在将像素数据转换回 UIImage 后获得的。上一个是原始图像。两者看起来完全相似,但是当您放大时,您会看到应该在图像最后一列的像素显示在第一列,但其余数据是准确的。
// 从二维像素数组获得的图像(第一列数据不准确)
// 实际图像
下面是我用来将 UIImage 转换为像素的代码,反之亦然。我可以找出我做错了什么。请帮我解决这个问题。
//将UIimage转换为二维像素矩阵的代码
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);
}
//从二维像素矩阵中获取返回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);*