Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

Вы говорите:

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

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

Ответ 2

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

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