Converting between multiple image formats in Objective-C

ぐ巨炮叔叔 提交于 2019-11-28 08:02:41

问题


I want to be able to, being given a path to an image, convert that image into another image, but with a different format. By format I mean .png, .bmp .jpg .tiff, etc. In pseudocode, this is really easy:

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

I have no idea how to do this, though. I barely know more than the NSImage class when it comes to handling images), and that does not seem to have the answer to my problem (no simple save methods like this). Here is the list of formats I'd like to support:

  • .png
  • .tiff
  • .gif
  • .jpeg
  • .bmp
  • PROBABLY .pdf (if it isn't very complicated)

By support I mean opening any of those and saving the opened image into any of those formats. There are some combinations here (15 ??? - I think), so I could write a method for each combination like so:

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

But it is defenitely better to use APIs.

If by any chance along the way I also have options like:

  • keep alpha or not
  • resize images

...I'd be happy to support them as well, although they're optional. I really hope there's a simple way to do this. THANKS

PS: I know there have been questions about this topic, but they were all iPhone oriented (I want to do this on the mac) and none of them provided a way to do this with multiple formats.


回答1:


Allright, so with Peter's help I could figure this out. First, if you're working with image paths, then open directly the file with NSData like so:

NSData* imgData = [NSData dataWithContentsOfFile: filePath];

If you're working with NSImage objects and is difficult for you to have the path (for example with an NSImageView) then do this (image is the NSImage object you have):

NSData* imgData = [image TIFFRepresentation];

Now that you have your image into NSData objects, get it into a NSBitmapImageRep:

NSBitmapImageRep* bitmap = [NSBitmapImageRep imageRepWithData: imgData];

And then get a new NSData object, but with a different format:

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

Finally, save that newData into a file:

[newData writeToFile: newPath atomically: YES]

Simple as pie, once you get how it works!


The support for transparency and size control is not that difficult either:

  • The NSImage class provides support for setting image's size (-setSize:)
  • The NSImageRep (superclass of NSBitmapImageRep) has the -setAlpha: method

Just call those when you need. +1 for Cocoa!




回答2:


Exploring outward from NSImage leads you to NSBitmapImageRep, which does exactly what you want.

Some of those iPhone questions are relevant as well, because the solution that works on both platforms (and the implementation behind the NSBitmapImageRep solution nowadays) is to use CGImageSource to read in the image and CGImageDestination to write it out.



来源:https://stackoverflow.com/questions/6562195/converting-between-multiple-image-formats-in-objective-c

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!