Когда мне следует использовать UIImageJPEGRepresentation и UIImagePNGRepresentation для загрузки на сервер различных форматов изображений?

В моем приложении я должен отправить изображения различных форматов на сервер (это должны быть все форматы файлов, которые могут быть прочитаны UIImage класс) https://developer.apple.com/library/ios/#documentation/uikit/reference/UIImage_Class/Reference/Reference.html

И проблема в том, что я не знаю, когда мне следует использовать каждый из этих методов. Конечно, очевидно, что для .png изображения мне нужно использовать UIImagePNGRepresentation и для .jpg/.jpegUIImageJPEGRepresentation, А как же другие форматы (.tiff, .gif, так далее.)? Есть только два метода для работы с изображениями и так много форматов.

2 ответа

Решение

Ты говоришь:

Конечно, очевидно, что для изображений.png мне нужно использовать UIImagePNGRepresentation и для.jpg/.jpeg UIImageJPEGRepresentation,

Нет, это не обязательно так. Если у вас есть какой-то оригинальный "цифровой актив", а не создание UIImage а затем с помощью одной из этих двух функций, чтобы создать NSData что вы будете загружать, вы часто просто загружаете NSData от первоначального актива и обойти туда и обратно в UIImage совсем. Если вы сделаете это, вы не рискуете потерять данные, которые преобразуются в UIImage, а затем обратно, может вызвать.

Есть несколько дополнительных соображений:

  1. Метаданные:

    Эти UIImageXXXRepresentation функции лишают изображения своих метаданных. Иногда это хорошо (например, вы не хотите загружать фотографии своих детей или дорогих гаджетов, в том числе места GPS, где недовольные могут определить, где был сделан снимок). В других случаях вы не хотите, чтобы метаданные были выброшены (например, дата исходного снимка, какая камера и т. Д.).

    Вы должны принять четкое решение относительно того, хотите ли вы удалить метаданные или нет. Если нет, не обходите свое изображение через UIImage, а лучше использовать оригинальный актив.

  2. Потеря качества изображения и / или размер файла:

    Я особенно не без ума от UIImageJPEGRepresentation потому что это сжатие с потерями. Таким образом, если вы используете compressionQuality значение меньше 1,0, вы можете потерять некоторое качество изображения (скромная потеря качества для значений, близких к 1,0, более значительная потеря качества при меньшем compressionQuality ценности). И если вы используете compressionQuality 1.0, вы уменьшаете большую часть потери качества изображения JPEG, но в результате NSData часто может быть больше исходного ресурса (по крайней мере, если сам оригинал был сжатым JPEG или PNG), что приводит к более медленной загрузке.

    UIImagePNGRepresentation не приводит к потере данных на основе сжатия, но в зависимости от изображения вы все равно можете потерять данные (например, если исходный файл был 48-битным TIFF или использовал цветовое пространство, отличное от sRGB).

    Вопрос в том, согласны ли вы с некоторой потерей качества изображения и / или большим размером файла в процессе загрузки.

  3. Размер изображения:

    Иногда вы не хотите загружать изображение в полном разрешении. Например, вы можете использовать веб-сервис, который хочет изображения не более 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);

Это было адаптировано из кода в этой книге.

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