使用 Objective C 将 RGB 彩色图像更改为灰度图像
我正在开发一个将彩色图像更改为灰度图像的应用程序。然而,有些图片显示出来是错误的。我不知道代码有什么问题。也许我输入的参数有误,请帮忙。
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;
I was developing a application that changes color image to gray image. However, some how the picture comes out wrong. I dont know what is wrong with the code. maybe the parameter that i put in is wrong please help.
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;
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
如果有人想要包含透明部分的灰度图像,则由 digipeople 提供的解决方案将在其周围有一个黑色掩模。使用它来保持透明原样。
If someone wants to gray scale images that contain transparent parts the solution offered by digipeople will have a black mask around it. Use this instead to leave the transparent as it is.
只需使用这个:
Just use this:
Swift 版本,已测试且 100% 正常工作:
如果你不需要 alpha,只需删除以下行:
Swift version, tested and working 100%:
And if u want no alpha just delete the following line: