Objective-C中多种图像格式之间的转换
我希望能够,给定一个图像的路径,将该图像转换为另一个图像,但格式不同。所谓格式,我指的是伪代码中的.png、.bmp.jpg.tiff等格式,这非常简单:Objective-C中多种图像格式之间的转换,objective-c,cocoa,image,macos,image-conversion,Objective C,Cocoa,Image,Macos,Image Conversion,我希望能够,给定一个图像的路径,将该图像转换为另一个图像,但格式不同。所谓格式,我指的是伪代码中的.png、.bmp.jpg.tiff等格式,这非常简单: image = [ImageAPI open: imagePath] [image save: imagePath withFormat: IMAGEFORMAT] // this is important 不过我不知道怎么做。在处理图像方面,我只知道NSImage类),而这似乎并没有解决我的问题(没有像这样简单的保存方法)。以下是我希望支
image = [ImageAPI open: imagePath]
[image save: imagePath withFormat: IMAGEFORMAT] // this is important
不过我不知道怎么做。在处理图像方面,我只知道NSImage类),而这似乎并没有解决我的问题(没有像这样简单的保存方法)。以下是我希望支持的格式列表:
- .png
- 蒂芙先生
- .gif
- .jpeg
- .bmp
- 可能是.pdf(如果不是很复杂的话)
[self saveTiffImageIntoGifWithPath: path] (*15 !!!)
但从防御性角度来说,使用API更好
如果有任何机会,我也有如下选择:
- 是否保留alpha
- 调整图像大小
其中一些iPhone问题也是相关的,因为在这两种平台上都可以使用的解决方案(以及现在NSBitmapImageRep解决方案背后的实现)是用来读取图像并将其写出。好吧,在Peter的帮助下,我可以解决这个问题。首先,如果您正在使用图像路径,则直接使用NSData打开文件,如下所示:
NSData* imgData = [NSData dataWithContentsOfFile: filePath];
如果您正在使用NSImage对象,并且很难获得路径(例如使用NSImageView),请执行此操作(图像是您拥有的NSImage对象):
现在已将图像放入NSData对象中,请将其放入NSBitmapImageRep:
NSBitmapImageRep* bitmap = [NSBitmapImageRep imageRepWithData: imgData];
然后获取一个新的NSData对象,但格式不同:
NSData* newData = [bitmap representationUsingType: NSPNGFileType properties: nil];
// I used NSPNGFileType as an example, but all the
// types I wanted to convert between (except PDF) are supported
最后,将新数据保存到文件中:
[newData writeToFile: newPath atomically: YES]
很简单,一旦你了解了它的工作原理
对透明度和大小控制的支持也没有那么困难:
- NSImage类支持设置图像大小(-setSize:)
- NSImageRep(NSBitmapImageRep的超类)具有-setAlpha:方法
你需要的时候就打电话给他们+一杯可可 好吧,NSBitmapImageRep似乎在进行转换(
representationUsingType:properties:
),但我真的不知道如何保存图像!我用NSImage加载图像,使用[NSBitmapImageRep representationUsingType:properties://添加一个表示,然后呢?!?没有像saveImageToPath
这样的保存方法。我一定错过了一些很明显的东西…哦。。。我想这次我拿到了。请检查此项:我使用NSData打开原始图像,将数据传递到[NSBitmapImageRep initWithData://code>,调用[NSBitmapImageRep representationUsingType:properties://code>,然后将结果数据写入文件。瞧!是这个吗?最好是这样,否则我会很困惑的。我现在不能测试它,所以我要问。PS:如果是这样的话,那么解决方案真的很明显…:)@亚历克斯·特鲁佩尔:是的,尽管NSBitmapImageRep允许您直接从文件内容创建一个。(别忘了查看超类!)这做了很多不必要的工作。无需将文件导出到TIFF即可将其导出为PNG。当您有文件路径或文件内容的数据时,创建NSBitmapImageRep只需一步,然后您就可以直接从中创建PNG数据了。@peter是的,我知道。但是想象一下,我正在使用NSImageView。它不提供路径,只提供NSImage对象,因此在这种情况下,您需要将NSImage转换为NSData,这是我找到的唯一方法。当然,不然!不要使用NSImage,像你说的那样用NSData打开。或者当你有路径时,直接从文件中打开。如果你曾经有过一条路,为什么不保留它呢?您不应该在视图中存储模型;将其传递给视图仅供视图使用。控制器应始终保持原始图像的路径不变。如果这是一个基于文档的应用程序,它无论如何都会这样做;如果没有,你必须,而且你应该自己做。
[newData writeToFile: newPath atomically: YES]