从NSData创建UiImage

6
以下是我从这个网站复制并稍微修改的代码,因为原始代码无法编译。我想操作字节数组以进行边缘检测和最终进行简单的颜色更改,但首先我想让基本代码能够正常工作。目前,系统已经成功编译和运行。它在屏幕上显示了一只糟糕的大象。当我触摸图像时,它会消失。逐步调试显示imageWithData的结果为0x0。我尝试使用png和bmp格式,结果相同。

有什么线索可以告诉我我做错了什么?!

ImageViewDrawable的定义如下:

@interface ImageViewDrawable : UIImageView

// I am using the following code to initialize this ImageView
ImageViewDrawable * uiv = [[ImageViewDrawable alloc] initWithImage:[UIImage imageNamed:@"ele.png"] ];

-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    // get and work on pixel data
    NSData* pixelData = (NSData*) CGDataProviderCopyData(CGImageGetDataProvider(self.image.CGImage));
    char* bytes =[pixelData bytes];

    // Take away the red pixel, assuming 32-bit RGBA
    for(int i = 0; i < [pixelData length]; i += 4) {
        bytes[i] = bytes[i]; // red
        bytes[i+1] = bytes[i+1]; // green
        bytes[i+2] = bytes[i+2]; // blue
        bytes[i+3] = bytes[i+3]; // alpha
    }

    // convert pixel back to uiiimage
    NSData* newPixelData = [NSData dataWithBytes:bytes length:[pixelData length]];
    char * bytes2 =[pixelData bytes];   
    UIImage * newImage = [UIImage imageWithData:newPixelData] ; 
    [self setImage: newImage ]; 
}
1个回答

4

imageWithData:不能将任意数据解释为RGBA未压缩纹理。它需要包含被识别为图像格式(如JPG、PNG或TIFF)的字节的数据,对其进行解析并适当地解压缩。

为了实现您想要的功能,您需要创建一个恰当配置的CGContext(行字节数、像素格式等),可以使用已分配的内存作为其后备存储器,也可以通过请求其存储器并将字节复制到其中来创建它。一旦这样做,您就可以使用所有与CGContext相关的功能,包括从该上下文创建UIImage的能力。


1
那么,我输入的数据基本上来自现有的UIImage,这并不重要吗? - user172639
我明白了我的问题。这个嵌套的调用 -- CGDataProviderCopyData(CGImageGetDataProvider( )) -- 获取数据提供者,然后只是复制数据。这意味着我只获取了像素而没有原始图像的其余配置信息。因此,我必须使用这些像素和你提到的CG信息重新创建一个图像。再次感谢您的帮助。 - user172639

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接