2

我对正确使用 UIImage 和方法 drawInRect 有疑问。

我使用 iPad 4,Xcode 版本6.1.1,IOS 8.1.2,我使用 ARC,我尝试过不使用 ARC

所以,我有图像“1.jpg”。

图像属性:

尺寸: 7500 x 8871 像素

分辨率: 72 像素/英寸

色彩空间: RGB

阿尔法通道:

我需要重新缩放原始图像“1.jpg”

我使用这段代码:

UIImage *originalImage=[UIImage imageNamed:@"1.jpg"];
CGSize newSize=(CGSizeMake(4096, 4096));
originalImage=[self GetScaledImage : originalImage andSize: newSize];

//----缩放方法---------//

-(UIImage *) GetScaledImage :(UIImage *) inputImage andSize :(CGSize) inputSize
{

 UIImage *newImage=[[[UIImage alloc] initWithCGImage:inputImage.CGImage] autorelease];    
 if (newImage)
 {        
     UIGraphicsBeginImageContext(inputSize);
     [newImage drawInRect: CGRectMake(0, 0, inputSize.width, inputSize.height)];
     newImage = UIGraphicsGetImageFromCurrentImageContext();
     UIGraphicsEndImageContext();
 }

 return newImage;
}

我的问题:

如果我使用 newSize: (4096, 4096)

UIImage *originalImage=[UIImage imageNamed:@"1.jpg"];
CGSize newSize=(CGSizeMake(4096, 4096));

现在的内存: 3.1 MB

originalImage=[self GetScaledImage : originalImage andSize: newSize];

现在的内存: 4.3 MB

它工作正常

如果我使用 newSize: (3000, 4096)

我有这个:

UIImage *originalImage=[UIImage imageNamed:@"1.jpg"];
CGSize newSize=(CGSizeMake(3000, 4096));

现在的内存: 3.1 MB

originalImage=[self GetScaledImage : originalImage andSize: newSize];

现在内存: 52 MB

它工作不正确

和魔术:如果我使用 newSize: (4096,3000) 它也可以正常工作,(3000,4096) 工作不正确

所以,我的问题是:它是如何工作的?

4

2 回答 2

1

您可以改用以下方法解决问题。

+ (UIImage *)scaleImageWithData:(NSData *)data withSize:(CGSize)size
                          scale:(CGFloat)scale
                    orientation:(UIImageOrientation)orientation {
    CGFloat maxPixelSize = MAX(size.width, size.height);
    CGImageSourceRef sourceRef = CGImageSourceCreateWithData((__bridge CFDataRef)data, nil);
    NSDictionary *options = @{(__bridge id)kCGImageSourceCreateThumbnailFromImageAlways:(__bridge id)kCFBooleanTrue,
                              (__bridge id)kCGImageSourceThumbnailMaxPixelSize:[NSNumber numberWithFloat:maxPixelSize]
                              };
    CGImageRef imageRef = CGImageSourceCreateThumbnailAtIndex(sourceRef, 0, (__bridge CFDictionaryRef)options);
    UIImage *resultImage = [UIImage imageWithCGImage:imageRef scale:scale orientation:orientation];
    CGImageRelease(imageRef);
    CFRelease(sourceRef);
    
    return resultImage;
}
于 2021-10-21T10:17:13.927 回答
0

我想没有魔法。CGImage 对象没有被释放,而是被拥有。为此,您需要将 image.CGImage 设置为某个变量,然后使用

CFRelease(cgImage);

在所有处理完成后,还要尝试清除图形上下文。

于 2014-12-18T19:35:25.283 回答