我将 NSBitmapImageRep 保存到 BMP 文件(雪豹)。当我在macos上打开它时似乎没问题。但它在我的多媒体设备上出错(可以显示来自互联网的任何 BMP 文件)。我不知道出了什么问题,但是当我查看文件内部时(在 macos 上使用很酷的 hexfiend 应用程序),有两件事错了:
- 标头的 biHeight 参数值错误:4294966216 (hex=C8FBFFFF) 标头具有正确的 biWidth 参数:1920
- 位图内容中的第一个像素(在 BMP 格式的 54 字节标头之后)对应于原始图像的左上角。在原始 BMP 文件中,按照 BMP 格式的规定,它应该首先是左下角像素。
为了解释我的应用程序中的完整工作流程,我有一个 NSImageView,我可以在其中拖动 BMP 图像。这个视图绑定到一个 NSImage。拖放后,我有一个操作可以将此图像(上面绘制一些文本)保存到 BMP 文件中。
这是保存新 BMP 文件的代码:
CGColorSpaceRefcolorSpace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB);
CGContextRefcontext = CGBitmapContextCreate(NULL, (int)1920, (int)1080, 8, 4*(int)1920, colorSpace, kCGImageAlphaNoneSkipLast);
[duneScreenViewdrawBackgroundWithDuneFolder:self inContext:context inRect:NSMakeRect(0,0,1920,1080) needScale:NO];
if(folderType==DXFolderTypeMovie) {
[duneScreenViewdrawSynopsisContentWithDuneFolder:self inContext:context inRect:NSMakeRect(0,0,1920,1080) withScale:1.0];
}
CGImageRef backgroundImageRef = CGBitmapContextCreateImage(context);
NSBitmapImageRep*bitmapBackgroundImageRef = [[NSBitmapImageRepalloc] initWithCGImage:backgroundImageRef];
NSData*data = [destinationBitmap representationUsingType:NSBMPFileType properties:nil];
[data writeToFile:[NSStringstringWithFormat:@"%@/%@", folderPath,backgroundPath] atomically: YES];
duneScreenViewdrawSynopsisContentWithDuneFolder 方法使用 CGContextDrawImage 来绘制图像。duneScreenViewdrawSynopsis 方法使用 CoreText 在同一上下文中绘制一些文本。
你知道出了什么问题吗?