在Objective-C中转换多种图像格式

时间:2011-07-03 09:57:43

标签: objective-c cocoa image macos image-conversion

我希望能够获得图像路径,将该图像转换为另一个图像,但格式不同。格式我的意思是.png,.bmp .jpg .tiff等。在伪代码中,这很容易:

image = [ImageAPI open: imagePath]
[image save: imagePath withFormat: IMAGEFORMAT] // this is important
但是,我不知道如何做到这一点。在处理图像时,我几乎不知道NSImage类,并且似乎没有我的问题的答案(没有像这样的简单保存方法)。以下是我要支持的格式列表:

  • .PNG
  • .TIFF
  • .gif注意
  • .JPEG
  • .BMP
  • PROBABLY .pdf(如果不是很复杂)

支持我的意思是打开其中任何一个并将打开的图像保存为任何格式。这里有一些组合(15 ??? - 我认为),所以我可以为每个组合编写一个方法,如下所示:

[self saveTiffImageIntoGifWithPath: path] (*15 !!!)

但使用API​​确实更好。

如果顺便提一下,我也有以下选项:

  • 保持alpha或不
  • 调整图片大小

......我也很乐意支持他们,尽管他们是可选的。 我真的希望有一个简单的方法来做到这一点。致谢

PS:我知道有关于这个主题的问题,但它们都是面向iPhone的(我想在Mac上执行此操作)并且它们都没有提供使用多种格式的方法。

2 个答案:

答案 0 :(得分:9)

好吧,所以在彼得的帮助下,我可以解决这个问题。首先,如果你正在使用图像路径,那么直接用NSData打开文件,如下所示:

NSData* imgData = [NSData dataWithContentsOfFile: filePath];

如果您正在使用NSImage对象并且很难获得路径(例如使用NSImageView),那么执行此操作(image是您拥有的NSImage对象):

NSData* imgData = [image TIFFRepresentation];

现在您将图像放入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保存到文件中:

[newData writeToFile: newPath atomically: YES]

简单就像馅饼一样,一旦你了解它的运作方式!


对透明度和尺寸控制的支持也不是那么困难:

  • NSImage类支持设置图像的大小(-setSize :)
  • NSImageRep(NSBitmapImageRep的超类)具有-setAlpha:方法

只需在需要时拨打电话即可。给Cocoa +1!

答案 1 :(得分:2)

NSImage向外探索会引导您NSBitmapImageRep,这正是您想要的。

其中一些iPhone问题也是相关的,因为适用于两个平台的解决方案(以及现在NSBitmapImageRep解决方案背后的实现)是使用CGImageSource来读取图像并CGImageDestination把它写出来。