7

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

image = [ImageAPI open: imagePath]
[image save: imagePath withFormat: IMAGEFORMAT] // this is important

不过,我不知道该怎么做。在处理图像方面,我几乎不知道 NSImage 类),这似乎没有解决我的问题(没有像这样的简单保存方法)。这是我想支持的格式列表:

  • .png
  • .tiff
  • .gif
  • .JPEG
  • .bmp
  • 可能是.pdf(如果不是很复杂)

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

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

但是使用 API 肯定更好。

如果在此过程中有任何机会,我还有以下选择:

  • 是否保留 alpha
  • 调整图像大小

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

PS:我知道有关于这个话题的问题,但它们都是面向 iPhone 的(我想在 mac 上做这个),而且没有一个提供了一种方法来用多种格式做到这一点。

4

2 回答 2

11

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

NSData* imgData = [NSData dataWithContentsOfFile: filePath];

如果您正在使用 NSImage 对象并且很难获得路径(例如使用 NSImageView),请执行此操作(图像是您拥有的 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: 方法

只需在您需要时打电话给他们。+1 可可!

于 2011-07-04T16:16:36.760 回答
2

NSImage向外探索将引导您到NSBitmapImageRep,它完全符合您的要求。

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

于 2011-07-04T04:08:13.573 回答