3

約 8MP の元の解像度の画像から画像のサイズを変更することに苦しんでおり、私の出力解像度は約 2MP です。iPhone4S デバイスでメモリ警告が表示されることがあり、メモリ警告でいくつかのリリースを行いましたが、alassetlibrary の使用の問題でプログラムがクラッシュすることがあります。これが私の質問です。fullReoslutionImage のサイズ変更中にメモリ警告が表示されないようにしたいのです。

画像のサイズを変更するための多くの方法を試しました。私の現在の方法は、ピーク時のメモリ使用量に対して約 44MB の増加です。大きすぎるようです...システム全体では、57 MB のピークがあります... CGImageSourceCreateThumbnailAtIndex を試しましたが、現在の方法よりも多くのメモリが増加します。

これが私の解決策ですが、それでもメモリ警告が発生することがあります。他の方法はありますか?私たちを手伝ってくれますか?いくつかのアイデア、1. その他の iOS API? 2. JPEG デコーダのオンザフライ サイズ変更用のネイティブ ライブラリは? 3. RGBA の代わりに YUV422 リサイザー。4. ..... わからない...

UIImage *image=[self oriImageThumbnailAtIndex:asset];
        CGInterpolationQuality interpolationQuality=kCGInterpolationMedium;            
        CGSize newSize=[self sizeDown:image.size];            
        image2 =makeResizedImageRotate(image, newSize, interpolationQuality,[defaultRep orientation]);


-(UIImage *) oriImageThumbnailAtIndex:(ALAsset *)asset
{
int times=0;
ALAssetRepresentation* assetRepresentation=asset.defaultRepresentation;
long long imageDataSize = [assetRepresentation size];    
uint8_t* imageDataBytes = (uint8_t*) malloc(imageDataSize);
[assetRepresentation getBytes:imageDataBytes fromOffset:0 length:imageDataSize error:nil];
NSData *data = [NSData dataWithBytesNoCopy:imageDataBytes length:imageDataSize freeWhenDone:YES];
UIImage *image2=nil;  
CGImageSourceRef src = CGImageSourceCreateWithData((__bridge CFDataRef) data, NULL);        
CGImageRef thumbnail;
if (src)
{
    float _maxSize=RESIZE_IMAGE_BIG_SIDE;
    thumbnail = CGImageSourceCreateImageAtIndex(src, 0, NULL); // Create scaled image
    image2 = [UIImage imageWithCGImage:thumbnail];        
    CGImageRelease(thumbnail);        
}else{
    NSLog(@"resizeImage:(ALAsset *)asset error!!!");        
}

return image2;
}

UIImage* makeResizedImageRotate(UIImage *inimage,CGSize newSize,CGInterpolationQuality interpolationQuality,UIImageOrientation orient) {
CGRect newRect = CGRectIntegral(CGRectMake(0, 0, newSize.width, newSize.height));
CGImageRef imageRef = inimage.CGImage;

// Compute the bytes per row of the new image
size_t bytesPerRow = CGImageGetBitsPerPixel(imageRef) / CGImageGetBitsPerComponent(imageRef) * newRect.size.width;
bytesPerRow = (bytesPerRow + 15) & ~15;  // Make it 16-byte aligned
  CGBitmapInfo cgbmpinfo=CGImageGetBitmapInfo(imageRef);
CGContextRef bitmap = CGBitmapContextCreate(NULL,
                                            newRect.size.width,
                                            newRect.size.height,
                                            CGImageGetBitsPerComponent(imageRef),
                                            bytesPerRow,
                                            CGImageGetColorSpace(imageRef),
                                            cgbmpinfo);
if(bitmap!=nil)
    CGContextSetInterpolationQuality(bitmap, interpolationQuality);
else
    NSLog(@"bitmap==nil");


// Draw into the context; this scales the image
CGContextDrawImage(bitmap, newRect, imageRef);

// Get the resized image from the context and a UIImage
CGImageRef resizedImageRef = CGBitmapContextCreateImage(bitmap);
UIImage *resizedImage = [UIImage imageWithCGImage:resizedImageRef];
CGContextRelease(bitmap);
CGImageRelease(resizedImageRef);
resizedImage=rotateImage( resizedImage, orient);
// Clean up

// [resizedImage autorelease]; will introduce BAD_ADDRESS
return resizedImage;

}

4

2 に答える 2

1

サードパーティの JPEG デコード ライブラリ (libjpeg-turbo) を使用して 2048x2048 の UIImage でデコードおよびサイズ変更すると、大幅に削減されることがわかりました。 2Kx2K より大きい。お役に立てれば。

于 2012-12-16T02:16:51.160 に答える
0

以下のコードを使用しています

-(UIImage*) generateThumbnailFromImage:(UIImage*)mainImage
{
    UIImage * thumbnail;

    CGSize destinationSize = CGSizeMake(thumbnail image width,thumbnail image height);

    UIGraphicsBeginImageContext(destinationSize);
    [mainImage drawInRect:CGRectMake(0,0,destinationSize.width, destinationSize.height)];
    thumbnail = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return thumbnail;
}

コードでどのように機能するかを試して、メモリの警告に直面したことはありません。

于 2012-11-10T12:53:35.993 に答える