2

我正在尝试从 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);*
4

0 回答 0