Когда мне следует использовать UIImageJPEGRepresentation и UIImagePNGRepresentation для загрузки на сервер различных форматов изображений?
В моем приложении я должен отправить изображения различных форматов на сервер (это должны быть все форматы файлов, которые могут быть прочитаны UIImage
класс) https://developer.apple.com/library/ios/#documentation/uikit/reference/UIImage_Class/Reference/Reference.html
И проблема в том, что я не знаю, когда мне следует использовать каждый из этих методов. Конечно, очевидно, что для .png
изображения мне нужно использовать UIImagePNGRepresentation
и для .jpg/.jpeg
UIImageJPEGRepresentation
, А как же другие форматы (.tiff
, .gif
, так далее.)? Есть только два метода для работы с изображениями и так много форматов.
2 ответа
Ты говоришь:
Конечно, очевидно, что для изображений.png мне нужно использовать
UIImagePNGRepresentation
и для.jpg/.jpegUIImageJPEGRepresentation
,
Нет, это не обязательно так. Если у вас есть какой-то оригинальный "цифровой актив", а не создание UIImage
а затем с помощью одной из этих двух функций, чтобы создать NSData
что вы будете загружать, вы часто просто загружаете NSData
от первоначального актива и обойти туда и обратно в UIImage
совсем. Если вы сделаете это, вы не рискуете потерять данные, которые преобразуются в UIImage
, а затем обратно, может вызвать.
Есть несколько дополнительных соображений:
Метаданные:
Эти
UIImageXXXRepresentation
функции лишают изображения своих метаданных. Иногда это хорошо (например, вы не хотите загружать фотографии своих детей или дорогих гаджетов, в том числе места GPS, где недовольные могут определить, где был сделан снимок). В других случаях вы не хотите, чтобы метаданные были выброшены (например, дата исходного снимка, какая камера и т. Д.).Вы должны принять четкое решение относительно того, хотите ли вы удалить метаданные или нет. Если нет, не обходите свое изображение через
UIImage
, а лучше использовать оригинальный актив.Потеря качества изображения и / или размер файла:
Я особенно не без ума от
UIImageJPEGRepresentation
потому что это сжатие с потерями. Таким образом, если вы используетеcompressionQuality
значение меньше 1,0, вы можете потерять некоторое качество изображения (скромная потеря качества для значений, близких к 1,0, более значительная потеря качества при меньшемcompressionQuality
ценности). И если вы используетеcompressionQuality
1.0, вы уменьшаете большую часть потери качества изображения JPEG, но в результатеNSData
часто может быть больше исходного ресурса (по крайней мере, если сам оригинал был сжатым JPEG или PNG), что приводит к более медленной загрузке.UIImagePNGRepresentation
не приводит к потере данных на основе сжатия, но в зависимости от изображения вы все равно можете потерять данные (например, если исходный файл был 48-битным TIFF или использовал цветовое пространство, отличное от sRGB).Вопрос в том, согласны ли вы с некоторой потерей качества изображения и / или большим размером файла в процессе загрузки.
Размер изображения:
Иногда вы не хотите загружать изображение в полном разрешении. Например, вы можете использовать веб-сервис, который хочет изображения не более 800 пикселей на сторону. Или, если вы загружаете миниатюру, они могут захотеть что-то еще меньше (например, 32px x 32px). Изменяя размеры изображений, вы можете сделать загрузку намного меньше и, следовательно, намного быстрее (хотя с очевидной потерей качества). Но если вы используете алгоритм изменения размера изображения, то создаете PNG или JPEG с использованием этих
UIImageXXXRepresentation
функции были бы довольно распространенными.
Короче говоря, если я пытаюсь минимизировать потерю данных / качества, я бы загрузил исходный ресурс, если он находится в формате, который принимает сервер, и я бы использовал UIImagePNGRepresentation
(или же UIImageJPGRepresentation
с настройкой качества 1.0), если исходный ресурс не был в формате, принятом сервером. Но выбор использования этих UIImageXXXRepresentation
Функции - это вопрос ваших бизнес-требований и того, что принимает сервер.
Роб указывает на очень много хороших моментов, которые следует учитывать при работе с изображениями (+1), однако вот пример того, как создавать tiff и gif-ы, как вы и просили:
Во-первых, вам нужно сделать ссылку на ImageIO
библиотека (в рамках фаз сборки вашего приложения).
Далее вам нужно #import <ImageIO/ImageIO.h>
в верхней части вашего файла.
Затем следующий код преобразует изображение для вас:
// Get a reference to the image that you already have stored on disk somehow.
// If it isn't stored on disk, then you can use CGImageSourceCreateWithData() to create it from an NSData representation of your image.
NSURL *url = [[NSBundle mainBundle] URLForResource:@"01" withExtension:@"jpg"];
CGImageSourceRef src = CGImageSourceCreateWithURL((__bridge CFURLRef)(url), NULL);
// Create a URL referencing the Application Support Directory. We will save the new image there.
NSFileManager *fm = [NSFileManager defaultManager];
NSURL *suppurl = [fm URLForDirectory:NSApplicationSupportDirectory
inDomain:NSUserDomainMask
appropriateForURL:nil
create:YES
error:NULL];
// Append the name of the output file to the app support directory
// For tiff change the extension in the next line to .tiff
NSURL *gifURL = [suppurl URLByAppendingPathComponent:@"mytiff.gif"];
// Create the destination for the new image
// For tiff, use @"public.tiff" for the second argument of the next line (instead of @com.compuserve.gif".
CGImageDestinationRef dest = CGImageDestinationCreateWithURL((__bridge CFURLRef)gifURL,
(CFStringRef)@"com.compuserve.gif",
1,
NULL);
CGImageDestinationAddImageFromSource(dest, src, 0, NULL);
// Write the image data to the URL.
bool ok = CGImageDestinationFinalize(dest);
if (!ok)
NSLog(@"Unable to create gif file.");
// Cleanup
CFRelease(src);
CFRelease(dest);
Это было адаптировано из кода в этой книге.