gpt4 book ai didi

iphone - 如何确定和解释 CGImage 的像素格式

转载 作者:可可西里 更新时间:2023-11-01 03:29:16 26 4
gpt4 key购买 nike

我正在加载 this (very small) image使用:

UIImage* image = [UIImage named:@"someFile.png"];

图像是 4x1,它从左到右依次包含红色、绿色、蓝色和白色像素。

接下来,我从底层 CGImage 中获取像素数据:

NSData* data = (NSData*)CGDataProviderCopyData(CGImageGetDataProvider(image.CGImage));

现在,由于某些原因,像素数据的布局因 iOS 设备而异。

当我在模拟器或我的 iPhone 4 上运行该应用程序时,像素数据如下所示:

(255,0,0),(0,255,0),(0,0,255),(255,255,255)

因此,像素是每个像素 3 个字节,蓝色是最重要的字节,红色是最不重要的字节。所以我猜你称之为 BGR?

当我检查 CGBitmapInfo 时,我可以看到 kCGBitmapByteOrderMask 是 kCGBitmapByteOrderDefault。我找不到任何地方可以解释什么是“默认”。

另一方面,当我在第一代 iPhone 上运行它时,像素数据如下所示:

(0,0,255,255),(0,255,0,255),(255,0,0,255),(255,255,255,255)

所以每个 channel 4 个字节,alpha 是最重要的字节,蓝色是最不重要的字节。那么...这就是所谓的 ARGB?

我一直在查看 CGBitmapInfo 以寻找有关如何检测布局的线索。在第一代 iPhone 上,kCGBitmapAlphaInfoMask 是 kCGImageAlphaNoneSkipFirst。这意味着最高有效位将被忽略。所以这是有道理的。在第一代 iPhone 上,kCGBitmapByteOrderMask 是 kCGBitmapByteOrder32Little。我不知道这意味着什么,也不知道如何将它与 R、G 和 B 组件在内存中的布局方式联系起来。任何人都可以阐明这一点吗?

谢谢。

最佳答案

为确保设备独立性,最好使用 CGBitmapContext 为您填充数据。

像这样的东西应该可以工作

// Get the CGImageRef
CGImageRef imageRef = [theImage CGImage];

// Find width and height
NSUInteger width = CGImageGetWidth(imageRef);
NSUInteger height = CGImageGetHeight(imageRef);

// Setup color space
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

// Alloc data that the image data will be put into
unsigned char *rawData = malloc(height * width * 4);

// Create a CGBitmapContext to draw an image into
NSUInteger bytesPerPixel = 4;
NSUInteger bytesPerRow = bytesPerPixel * width;
NSUInteger bitsPerComponent = 8;
CGContextRef context = CGBitmapContextCreate(rawData, width, height,
bitsPerComponent, bytesPerRow, colorSpace,
kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
CGColorSpaceRelease(colorSpace);

// Draw the image which will populate rawData
CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef);
CGContextRelease(context);


for (NSUInteger y = 0; y < height; y++) {
for (NSUInteger x = 0; x < width; x++) {
int byteIndex = (bytesPerRow * y) + x * bytesPerPixel;

CGFloat red = rawData[byteIndex];
CGFloat green = rawData[byteIndex + 1];
CGFloat blue = rawData[byteIndex + 2];
CGFloat alpha = rawData[byteIndex + 3];
}
}

free(rawData);

关于iphone - 如何确定和解释 CGImage 的像素格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7300591/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com