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

Ale*_*lex 5 macos cocoa image objective-c image-conversion

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

image = [ImageAPI open: imagePath]
[image save: imagePath withFormat: IMAGEFORMAT] // this is important
Run Code Online (Sandbox Code Playgroud)

不过,我不知道该怎么做.在处理图像时,我几乎不知道NSImage类,并且似乎没有我的问题的答案(没有像这样的简单保存方法).以下是我要支持的格式列表:

  • 巴纽
  • .TIFF
  • .gif注意
  • .JPEG
  • .BMP
  • 可能.pdf(如果不是很复杂)

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

[self saveTiffImageIntoGifWithPath: path] (*15 !!!)
Run Code Online (Sandbox Code Playgroud)

但使用API​​确实更好.

如果一路上我有任何机会,我也有以下选项:

  • 保持阿尔法或不
  • 调整图像大小

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

PS:我知道有关于这个主题的问题,但它们都是面向iPhone的(我想在Mac上这样做)并且没有一个提供了使用多种格式的方法.

Ale*_*lex 9

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

NSData* imgData = [NSData dataWithContentsOfFile: filePath];
Run Code Online (Sandbox Code Playgroud)

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

NSData* imgData = [image TIFFRepresentation];
Run Code Online (Sandbox Code Playgroud)

现在您将图像放入NSData对象中,将其放入NSBitmapImageRep:

NSBitmapImageRep* bitmap = [NSBitmapImageRep imageRepWithData: imgData];
Run Code Online (Sandbox Code Playgroud)

然后获取一个新的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
Run Code Online (Sandbox Code Playgroud)

最后,将newData保存到文件中:

[newData writeToFile: newPath atomically: YES]
Run Code Online (Sandbox Code Playgroud)

一旦你了解它的工作原理,就像馅饼一样简单!


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

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

只需在需要时拨打电话即可.可可+1!