Преобразование между несколькими форматами изображений в Objective-C - PullRequest
5 голосов
/ 03 июля 2011

Я хочу иметь возможность, получив путь к изображению, преобразовать это изображение в другое изображение, но в другом формате. Под форматом я подразумеваю .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.

Если по пути у меня также есть варианты, такие как:

  • держите альфа или нет
  • изменить размер изображения

... Я был бы рад поддержать их, хотя они и не обязательны. Я действительно надеюсь, что есть простой способ сделать это. БЛАГОДАРЯ

PS: я знаю, что были вопросы по этой теме, но все они были ориентированы на iPhone (я хочу сделать это на Mac), и ни один из них не предоставил способ сделать это с несколькими форматами.

Ответы [ 2 ]

9 голосов
/ 04 июля 2011

Хорошо, так что с помощью Питера я могу это выяснить. Во-первых, если вы работаете с путями к изображениям, откройте файл 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 writeToFile: newPath atomically: YES]

Просто как пирог, как только вы поймете, как это работает!


Поддержка прозрачности и контроля размера не так уж и сложна:

  • Класс NSImage предоставляет поддержку для установки размера изображения (-setSize:)
  • NSImageRep (суперкласс NSBitmapImageRep) имеет -setAlpha: метод

Просто звоните, когда вам нужно. +1 за какао!

2 голосов
/ 04 июля 2011

Исследование внешнего вида от NSImage приводит вас к NSBitmapImageRep , который делает именно то, что вы хотите.

Некоторые из этих вопросов iPhone также актуальны, потому что решениекоторый работает на обеих платформах (и реализация, лежащая в основе решения NSBitmapImageRep в настоящее время) заключается в использовании CGImageSource для чтения изображения и CGImageDestination для его записи.

...