2011-01-06 85 views
0

我不知道是否有采取截图灰度一个简单的方法,我知道我可以取色截图如下:iPhone采取灰度截图?

UIGraphicsBeginImageContext(self.view.bounds.size); 
    [self.view.layer renderInContext:UIGraphicsGetCurrentContext()]; 
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    NSData *data = UIImagePNGRepresentation(image); 

现在我需要在这几行代码添加到做出的UIImage灰度化?谢谢你的阅读。

回答

4

只需将图像转换为灰度。 阅读this后。祝你好运。

这里是方法:d

#pragma mark - 
#pragma mark Grayscale 

- (UIImage *)convertImageToGrayScale:(UIImage *)image 
{ 
    // Create image rectangle with current image width/height 
    CGRect imageRect = CGRectMake(0, 0, image.size.width, image.size.height); 

    // Grayscale color space 
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray(); 

    // Create bitmap content with current image size and grayscale colorspace 
    CGContextRef context = CGBitmapContextCreate(nil, image.size.width, image.size.height, 8, 0, colorSpace, kCGImageAlphaNone); 

    // Draw image into current context, with specified rectangle 
    // using previously defined context (with grayscale colorspace) 
    CGContextDrawImage(context, imageRect, [image CGImage]); 

    // Create bitmap image info from pixel data in current context 
    CGImageRef imageRef = CGBitmapContextCreateImage(context); 

    // Create a new UIImage object 
    UIImage *newImage = [UIImage imageWithCGImage:imageRef]; 

    // Release colorspace, context and bitmap information 
    CGColorSpaceRelease(colorSpace); 
    CGContextRelease(context); 
    CFRelease(imageRef); 

    // Return the new grayscale image 
    return newImage; 
} 
+0

我现在没有任何功能可以这样做::D你可以实现一个:D – 2011-01-06 09:26:32

0

基于凸轮与处理规模为Retina显示屏的功能代码。

- (UIImage *) toGrayscale 
{ 
// Create image rectangle with current image width/height 
CGRect imageRect = CGRectMake(0, 0, self.size.width * self.scale, self.size.height * self.scale); 

int width = imageRect.size.width; 
int height = imageRect.size.height; 

// the pixels will be painted to this array 
uint32_t *pixels = (uint32_t *) malloc(width * height * sizeof(uint32_t)); 

// clear the pixels so any transparency is preserved 
memset(pixels, 0, width * height * sizeof(uint32_t)); 

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 

// create a context with RGBA pixels 
CGContextRef context = CGBitmapContextCreate(pixels, width, height, 8, width * sizeof(uint32_t), colorSpace, 
             kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedLast); 

// paint the bitmap to our context which will fill in the pixels array 
CGContextDrawImage(context, CGRectMake(0, 0, width, height), [self CGImage]); 

for(int y = 0; y < height; y++) { 
    for(int x = 0; x < width; x++) { 
     uint8_t *rgbaPixel = (uint8_t *) &pixels[y * width + x]; 

     // convert to grayscale using recommended method: http://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscale 
     uint32_t gray = 0.3 * rgbaPixel[RED] + 0.59 * rgbaPixel[GREEN] + 0.11 * rgbaPixel[BLUE]; 

     // set the pixels to gray 
     rgbaPixel[RED] = gray; 
     rgbaPixel[GREEN] = gray; 
     rgbaPixel[BLUE] = gray; 
    } 
} 

// create a new CGImageRef from our context with the modified pixels 
CGImageRef image = CGBitmapContextCreateImage(context); 

// we're done with the context, color space, and pixels 
CGContextRelease(context); 
CGColorSpaceRelease(colorSpace); 
free(pixels); 

// make a new UIImage to return 
UIImage *resultUIImage = [UIImage imageWithCGImage:image 
              scale:self.scale 
             orientation:UIImageOrientationUp]; 

// we're done with image now too 
CGImageRelease(image); 

return resultUIImage; 
}