web-dev-qa-db-ja.com

異なる画像形式をサーバーにアップロードするために、UIImageJPEGRepresentationとUIImagePNGRepresentationをいつ使用すればよいですか?

私のアプリケーションでは、さまざまな形式の画像をサーバーに送信する必要があります(UIImageクラスで読み取ることができるすべてのファイル形式である必要があります) https://developer.Apple.com/library /ios/#documentation/uikit/reference/UIImage_Class/Reference/Reference.html

そして問題は、私がこの各方法をいつ使うべきかわからないことです。もちろん、.png画像の場合はUIImagePNGRepresentationを、.jpg/.jpegUIImageJPEGRepresentationを使用する必要があることは明らかです。しかし、他の形式(.tiff.gifなど)はどうですか?画像の操作には2つの方法しかなく、非常に多くの形式があります。

23

あなたは言う:

もちろん、.png画像の場合はUIImagePNGRepresentationを、.jpg/.jpegの場合はUIImageJPEGRepresentationを使用する必要があることは明らかです。

いいえ、必ずしもそうではありません。 UIImageを作成してから2つの関数の1つを使用してアップロードするNSDataを作成するのではなく、元の「デジタルアセット」がある場合は、元のアセットからNSDataをロードしてラウンドトリップをバイパスすることがよくあります。 UIImageにまったく。これを行うと、UIImageに変換され、その後再び元に戻す可能性があるデータの損失のリスクはありません。

ただし、さらにいくつかの考慮事項があります。

  1. メタデータ:

    これらのUIImageXXXRepresentation関数は、メタデータのイメージを取り除きます。場合によっては、それが良いこともあります(たとえば、子供や高価なガジェットの写真をアップロードしたくない場合は、GPSを使用して、不正なコンテンツによってショットが撮影された場所を特定できます)。他の場合では、メタデータが破棄されないようにする必要があります(たとえば、元のショットの日付、どのカメラなど)。

    メタデータを削除するかどうかを明示的に決定する必要があります。そうでない場合は、UIImageを介して画像をラウンドトリップせず、元のアセットを使用してください。

  2. 画質の低下やファイルサイズの考慮事項:

    非可逆圧縮 なので、私は特にUIImageJPEGRepresentationに夢中ではありません。したがって、1.0よりも小さいcompressionQuality値を使用すると、一部のイメージ品質が失われる可能性があります(1.0に近い値では中程度の品質低下、compressionQuality値が低いほど品質が大幅に低下)。また、1.0のcompressionQualityを使用すると、JPEG画質の損失の多くを軽減できますが、結果のNSDataは、多くの場合、元のアセットよりも大きくなる可能性があります(少なくとも、元のアセット自体が圧縮されたJPEGまたはPNGの場合)。アップロードが遅い。

    UIImagePNGRepresentationでは、圧縮ベースのデータ損失は発生しませんが、画像によっては、データが失われる可能性があります(たとえば、元のファイルが48ビットTIFFであるか、sRGB以外の色空間を使用していた場合)。

    アップロードプロセス中に画質が低下したり、ファイルサイズが大きくなったりするかどうかが問題です。

  3. 画像サイズ:

    フル解像度の画像をアップロードしたくない場合があります。たとえば、片面が800px以下の画像が必要なWebサービスを使用しているとします。または、サムネイルをアップロードしている場合、さらに小さなもの(32px x 32pxなど)が必要になる場合があります。画像のサイズを変更することで、アップロードを大幅に小さくし、速度を大幅に向上させることができます(ただし、明らかに品質が低下します)。ただし、 画像サイズ変更アルゴリズム を使用する場合、これらのUIImageXXXRepresentation関数を使用してPNGまたはJPEGを作成することは非常に一般的です。

つまり、データ/品質の損失を最小限に抑えようとする場合、サーバーが受け入れる形式の元のアセットをアップロードし、元のアセットの場合はUIImagePNGRepresentation(または品質設定1.0のUIImageJPGRepresentation)を使用します。アセットはサーバーで受け入れられる形式ではありませんでした。ただし、これらのUIImageXXXRepresentation関数の使用の選択は、ビジネス要件とサーバーが受け入れるものの問題です。

50
Rob

Robは画像(+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);

これは この本 のコードから変更されました。

2
lnafziger