Изменение цветного изображения RGB на изображение в оттенках серого с помощью Objective C

Я разрабатывал приложение, которое меняет цветное изображение на серое. Однако кое-как картина получается неверной. Я не знаю, что не так с кодом. возможно, я ввел неверный параметр, пожалуйста, помогите.

 UIImage *c = [UIImage imageNamed:@"downRed.png"];
 CGImageRef cRef = CGImageRetain(c.CGImage);

 NSData* pixelData = (NSData*) CGDataProviderCopyData(CGImageGetDataProvider(cRef));

 size_t w = CGImageGetWidth(cRef);
 size_t h = CGImageGetHeight(cRef);

 unsigned char* pixelBytes = (unsigned char *)[pixelData bytes];

 unsigned char* greyPixelData = (unsigned char*) malloc(w*h);

 for (int y = 0; y < h; y++) {
 for(int x = 0; x < w; x++){

 int iter = 4*(w*y+x);
 int red = pixe lBytes[iter];
 int green = pixelBytes[iter+1];
 int blue = pixelBytes[iter+2];
 greyPixelData[w*y+x] = (unsigned char)(red*0.3 + green*0.59+ blue*0.11);
     int value = greyPixelData[w*y+x];

 }
 }

 CFDataRef imgData = CFDataCreate(NULL, greyPixelData, w*h);


 CGDataProviderRef imgDataProvider = CGDataProviderCreateWithCFData(imgData);


 size_t width = CGImageGetWidth(cRef);
 size_t height = CGImageGetHeight(cRef);
 size_t bitsPerComponent = 8;
 size_t bitsPerPixel = 8;
 size_t bytesPerRow = CGImageGetWidth(cRef);
 CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();
 CGBitmapInfo info = kCGImageAlphaNone;
 CGFloat *decode = NULL;
 BOOL shouldInteroplate = NO;
 CGColorRenderingIntent intent = kCGRenderingIntentDefault;
  CGDataProviderRelease(imgDataProvider);

 CGImageRef throughCGImage = CGImageCreate(width, height, bitsPerComponent, bitsPerPixel, bytesPerRow, colorSpace, info, imgDataProvider, decode, shouldInteroplate, intent);


 UIImage* newImage = [UIImage imageWithCGImage:throughCGImage];

CGImageRelease(throughCGImage);
 newImageView.image = newImage;
7
задан Cascabel 8 January 2011 в 07:21
поделиться