10

ユーザーが写真を撮るか、iPhone のライブラリから写真を選択して、Parse バックエンドにアップロードできるアプリを作成しています。

私が直面している問題は、ファイルのサイズに関するものです。

Facebook、Twitter、Instagram、Google などの大企業が解像度とファイル サイズに関して行っていることについて読んだことがありますが、それに近づくことはできません。

彼らはそれを行うための最高のコードとツールを持っていると確信していますが、iOS の通常のプロセスで可能な限り適切に実装できることを嬉しく思います。

これは私が今していることです:

- (UIImage *)normalResImageForAsset:(ALAsset*)asset
{
    // Convert ALAsset to UIImage
    UIImage *image = [self highResImageForAsset:asset];

    // Determine output size
    CGFloat maxSize = 1024.0f;
    CGFloat width = image.size.width;
    CGFloat height = image.size.height;
    CGFloat newWidth = width;
    CGFloat newHeight = height;

    // If any side exceeds the maximun size, reduce the greater side to 1200px and proportionately the other one
    if (width > maxSize || height > maxSize) {
        if (width > height) {
            newWidth = maxSize;
            newHeight = (height*maxSize)/width;
        } else {
            newHeight = maxSize;
            newWidth = (width*maxSize)/height;
        }
    }

    // Resize the image
    CGSize newSize = CGSizeMake(newWidth, newHeight);
    UIGraphicsBeginImageContext(newSize);
    [image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    // Set maximun compression in order to decrease file size and enable faster uploads & downloads
    NSData *imageData = UIImageJPEGRepresentation(newImage, 0.0f);
    UIImage *processedImage = [UIImage imageWithData:imageData];

    return processedImage;
}

1024px を最大許容サイズ (両方とも高さ) にしていくつかの制限を開始し、最大圧縮を適用してサイズを縮小しようとしています。

これは機能し、JPEG に実際にダメージを与えることなく画像サイズの約 50% を削減しますが、それでもまだ大きいです。特に写真が携帯電話のカメラで撮影され、アップロードされた場合。処理された画像はまだ簡単に 1MB のサイズを持つことができますが、これは大きすぎます。

有用な手順を見逃しているか、間違った手法を使用している可能性があると推測しています。

どんなフィードバックでも大歓迎です。

4

3 に答える 3

10

同様の問題があり、圧縮が機能していないとも思いました。私のコードの他の場所で、別の圧縮を使用してファイルをディスクに書き込んでいたことが判明しました。この関数が返すデータで同じことをしているかもしれません。実際に圧縮が効果的であることを確認する良い方法は、次のようにすることです。

NSData *imgData1 = UIImageJPEGRepresentation(newImage, 1.0f);
NSLog(@"1.0 size: %d", imgData1.length);

NSData *imgData2 = UIImageJPEGRepresentation(newImage, 0.7f);
NSLog(@"0.7 size: %d", imgData2.length);

NSData *imgData3 = UIImageJPEGRepresentation(newImage, 0.4f);
NSLog(@"0.4 size: %d", imgData3.length);

NSData *imgData4 = UIImageJPEGRepresentation(newImage, 0.0f);
NSLog(@"0.0 size: %d", imgData4.length);

// Don't convert NSData back to UIImage before writing to disk
[imgData4 writeToFile:imagePath atomically:YES];

640x480 の画像を使用していますが、ファイル サイズは 325 kB (1.0 の場合) から 18 kB (0.0 の場合) までです。

于 2014-02-16T07:34:21.323 に答える