简体   繁体   中英

Create UiImage from NSData

Below is code I copied (from this site) and modified only slightly since the original code would not compile. I want to manipulate the byte array for edge detection and eventually simple changes to colors, but first I wanted to get the basic code working. Currently, the system compiles and runs. It displays a badly drawn elephant on screen. When I touch the image, it disappears. Stepping through shows the result of imageWithData as 0x0. I have tried this with both a png and a bmp and same result

Any clues to what I am doing wrong ?!

ImageViewDrawable is defined as:

@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 ]; 
}

imageWithData: doesn't take some arbitrary data and interpret it as an RGBA uncompressed texture. It takes a data that contains bytes of a recognized image format (like JPG, PNG, or TIFF), parses thoses and decompresses the images appropriately.

In order to do what you want you need to create a CGContext which is appropriately configured (row bytes, pixel format, etc), either using the memory you already have allocated as its backing storage, or by asking it for its storage and then copying your bytes into it. Once you do that you can use all of the CGContext related functionality, including the ability to create a UIImage from that context.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM