gpt4 book ai didi

ios - UIImage方法 "drawInRect"的内存泄漏

转载 作者:行者123 更新时间:2023-12-01 16:36:47 28 4
gpt4 key购买 nike

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

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

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

图片属性:

尺寸: 7500 x 8871 像素

分辨率: 72 像素/英寸

色彩空间: RGB

阿尔法 channel :

我需要重新缩放原始图像“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) 工作不正确

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

最佳答案

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

+ (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;
}

关于ios - UIImage方法 "drawInRect"的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27544150/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com