这段代码产生了一些非常奇怪的输出。为什么?我所做的就是复制一幅图像。
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];示例:


发布于 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)应该是:
bytesPerRow: [image bytesPerRow]
bitsPerPixel: [image bitsPerPixel]使用参数bitmapFormat也是有用的,它表示像素的组件是RGB或BGR,以及alpha值在哪里(或填充字节)。
也许最好使用copy-method?
https://stackoverflow.com/questions/22270299
复制相似问题