Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
572 views
in Technique[技术] by (71.8m points)

cocoa - Converting between multiple image formats in Objective-C

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.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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!


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...