首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSBitmapImageRep错误

NSBitmapImageRep错误
EN

Stack Overflow用户
提问于 2014-03-08 14:03:24
回答 1查看 253关注 0票数 0

这段代码产生了一些非常奇怪的输出。为什么?我所做的就是复制一幅图像。

代码语言:javascript
复制
NSData *data = [NSData dataWithContentsOfFile: @"/Users/Jojo/Desktop/k2.jpg"];
NSBitmapImageRep *image = [NSBitmapImageRep imageRepWithData: data];

assert(image.samplesPerPixel == 3);
assert(image.isPlanar == NO);

uint8_t *buffer = [image bitmapData];

NSBitmapImageRep *rtn = [[NSBitmapImageRep alloc]
                        initWithBitmapDataPlanes:&buffer
                        pixelsWide:image.pixelsWide
                        pixelsHigh:image.pixelsHigh
                        bitsPerSample:8
                        samplesPerPixel:3
                        hasAlpha:NO
                        isPlanar:NO
                        colorSpaceName:NSDeviceRGBColorSpace
                        bytesPerRow: image.pixelsWide*3
                        bitsPerPixel: 8*3];

NSData *newJpg = [rtn representationUsingType:NSJPEGFileType properties:nil];
[newJpg writeToFile:@"/Users/Jojo/Desktop/and.jpg" atomically:YES];

示例:

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-08 15:34:45

我不知道你想实现什么;只是一张现有图像的副本?[image copy]不够好吗?此外,您的代码至少有两个大错误:您必须在图像的属性和这些属性的存储方式之间做出明确的区别。您忘记了填充字节,这些字节可能存在也可能不存在。这通常会从一个OSX版本更改为下一个OSX版本。因此,在源图像中,每个像素的样本数为3,但它们以4个字节存储(原因:存储访问优化)。因此bitsPerPixel: 8*3是错误的,bytesPerRow也是错误的。因此,源图像具有1600 bytes per row,每个像素都存储在32 bits (== 1填充字节)中。您必须使用与源NSBitmapImageRep完全相同的(缓冲区)参数为新的imageRep提供数据。这意味着:最后两个参数(创建一个新的rep)应该是:

代码语言:javascript
复制
bytesPerRow: [image bytesPerRow]
bitsPerPixel: [image bitsPerPixel]

使用参数bitmapFormat也是有用的,它表示像素的组件是RGB或BGR,以及alpha值在哪里(或填充字节)。

也许最好使用copy-method?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22270299

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档