如何使用uiimageview修改图像中的像素并在iPhone中显示新图像?

问题描述:

我是iphone的新手,我正在制作一个应用程序,我想要更改图像像素。我正在使用uiimageview。我做了一些工作。像素数据会随着我的想法发生变化,但不会显示新的更新图像。 这里是我的代码如何使用uiimageview修改图像中的像素并在iPhone中显示新图像?

-(void)Change{ 
struct pixel { 
    unsigned char r, g, b, a; 
}; 

UIImage *myimage = [ UIImage imageNamed:@"iphone-wallpapaer-silver-apple.jpg"]; 

NSUInteger numberOfRedPixels = 0; 
NSUInteger numberOfGreenPixels = 0; 
NSUInteger numberOfBluePixels = 0; 
NSUInteger numberOfAlphaPixels = 0; 
struct pixel* pixels = (struct pixel*) calloc(1, myimage.size.width * myimage.size.height * sizeof(struct pixel)); 
    if (pixels != nil) 
    { 
     // Create a new bitmap 

     CGContextRef context = CGBitmapContextCreate(
       (void*) pixels, 
       myimage.size.width, 
       myimage.size.height, 
       8, 
       myimage.size.width * 4, 
       CGImageGetColorSpace(myimage.CGImage), 
       kCGImageAlphaPremultipliedLast 
      ); 

     if (context != NULL) 
     { 
      // Draw the image in the bitmap 

      CGContextDrawImage(context, CGRectMake(0.0f, 0.0f, myimage.size.width, myimage.size.height), myimage.CGImage); 

      NSUInteger numberOfPixels = myimage.size.width * myimage.size.height; 
    //NSLog(@"%d",numberOfPixels); 
      while (numberOfPixels > 0) { 
       if (pixels->r == 255) { 
        pixels->r = 0; 
    //NSLog(@"%d",pixels->r); 
    numberOfRedPixels++; 
       } 
    if(pixels->g == 255){ 
    pixels->g = 0; 
    //NSLog(@"%d",pixels->g); 
    numberOfGreenPixels ++; 
    } 
    if(pixels->b == 255){ 
    pixels->b = 0; 
    //NSLog(@"%d",pixels->b); 
    numberOfBluePixels ++; 
    } 
    if(pixels->a == 255){ 
    pixels->a = 0; 
    numberOfAlphaPixels ++; 
    } 
       pixels++; 
       numberOfPixels--; 
    } 

    context = CGBitmapContextCreate((void*)pixels, 
      myimage.size.width, 
      myimage.size.height, 
      8, 
      myimage.size.width * 4, 
      CGImageGetColorSpace(myimage.CGImage), 
      kCGImageAlphaPremultipliedFirst); 
UIImage *newImage = [UIImage imageWithCGImage:context]; 
CGImageRef imageRef = CGBitmapContextCreateImage (newImage); 
} 

没有看到你的代码的其余部分,你可以尝试几件事情:

[self.myUIImageView setImage:newImage]; // actually sets the image into the view 
[newImage release]; //cleanup memory. 
[self needsDisplay]; //refresh the View 

你不应该需要CGImageRef底。

此外,请查看here了解如何以其他方式完成此操作的建议。


[编辑]

我的建议是不要使用CG的。

NSData *pixelData = UIImagePNGRepresentation(self.UIImageView.UIImage); //psuedo-code 

void* pixelBytes = [pixelData bytes]; 

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

谢谢,我已经明白这一点,并做了一些非常接近它。但问题在于开始。 CGBitmapContextCreate方法不能正确创建图像 – huzfi 2010-09-23 05:57:58

+0

您可以使用上面的'bytes [i]'做替代数学运算。 if(bytes [i] == 255){bytes [i] = 0; redPixels ++};'或者其他东西。 – 2010-09-23 12:56:57

context = CGBitmapContextCreate((void*)pixels, 

你不需要创建第二个上下文(并在这样做,你就泄露第一上下文)。我也不确定为什么你从AlphaPremultipliedLast更改为AlphaPremultipliedFirst。

UIImage *newImage = [UIImage imageWithCGImage:context]; 

context是一个CGContextRef,而不是CGImageRef。这是行不通的。

CGImageRef imageRef = CGBitmapContextCreateImage (newImage); 

newImage是一个UIImage *,而不是一个CGContextRef。那也行不通。

+0

谢谢我了解你提到的几点,并且已经用newimage和imageref进行了修改。现在我得到的概率是加载图像。当我用CGBitmapContextCreate创建它并将其复制到我的磁盘以进行确认时。它显示一个空白图像:( – huzfi 2010-09-23 05:56:21

+0

没有你的更新代码,很难调试。 – 2010-09-24 16:43:58