Преобразование между несколькими форматами изображений в Objective-C

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

Решение

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

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

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

Другие вопросы по тегам