【发布时间】:2012-10-04 15:42:49
【问题描述】:
我正在读取我的 UIImage (inputImage) 的 RGB 值,这样:
CGImageRef imageRef = inputImage.CGImage;
NSData *data = CFBridgingRelease(CGDataProviderCopyData(CGImageGetDataProvider(imageRef)));
unsigned char *pixels = (unsigned char *)[data bytes];
for(int i = 0; i < [data length]; i += 4) {
int r = i;
int g = i+1;
int b = i+2;
int rValue = (int)pixels[r];
int gValue = (int)pixels[g];
int bValue = (int)pixels[b];
}
完美运行。但是如果我在那段代码之前使用一个函数来调整图像大小,那么值就会出错。例如,他们说一个像素是 255 蓝色,而它是 255 红色。我觉得是在我使用函数的时候,红蓝RGB通道发生了变化(我知道,没有意义)。
这是我用来调整图像大小的函数:
- (UIImage *)imageWithImage:(UIImage *)image scaledToSize:(CGSize)newSize {
//UIGraphicsBeginImageContext(newSize);
UIGraphicsBeginImageContextWithOptions(newSize, NO, 0.0);
[image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
UIImage *newImage2 = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage2;
}
这就是我所说的:
inputImage = [self imageWithImage:inputImage scaledToSize:CGSizeMake(inputImage.size.width, inputImage.size.height)];
即使我将大小调整到与我相同的大小,也会发生这种情况。数据发生了一些奇怪的事情,但结果是正确的,图像的大小调整正确。 有谁知道是什么问题?
【问题讨论】:
-
第一个实例是直接读取图像,第二个实例是使用上下文。我猜第一个是RGB,另一个是BGR。使用 CGImageGetColorSpace(image.CGImage) 确认。
-
否...我在使用调整大小功能之前和之后使用 CGImageGetColorSpace(inputImage.CGImage),并返回相同的值:kCGColorSpaceDeviceRGB。但是 CGImageGetAlphaInfo 从 5 变为 2,CGImageGetBitmapInfo 从 5 变为 8194(¿?),而 CGImageGetBytesPerRow 从 1068 变为 1088(它总是增加 20 个字节,我使用什么图像并不重要)。都具有相同的图像,并使用该功能,但调整为相同的大小。
-
好的,现在我正确使用了CGImageGetBitmapInfo... kCGBitmapByteOrderMask 由NO 变为YES,kCGBitmapByteOrder32Little 由NO 变为YES,kCGBitmapByteOrder16Big 由NO 变为YES。其他常量不变,其值为 NO,除了 kCGBitmapAlphaInfoMask (YES)。
标签: iphone objective-c ios resize uiimage