1

请指导我。如何在不减少 ios 中的高度和宽度的情况下减小图像的大小?

我将通过设备相机拍照。大小约为 250kb。现在我想在不调整高度和宽度的情况下减少 100KB。

有可能做到吗?

请分享您的观点。

4

3 回答 3

1

将 jpg 图像转换为 jpeg 将减小大小。尝试这个。

[UIImage imageWithData:UIImageJPEGRepresentation(img, 0.01f)];
于 2013-01-09T09:21:58.077 回答
0

我通常使用此功能来压缩我在此答案中找到的 iOS 上的图像。

+ (NSData*)imageDataWithCGImage:(CGImageRef)CGimage UTType:(const CFStringRef)imageUTType desiredCompressionQuality:(CGFloat)desiredCompressionQuality
{
    NSData* result = nil;

    CFMutableDataRef destinationData = CFDataCreateMutable(kCFAllocatorDefault, 0);
    CGImageDestinationRef destinationRef = CGImageDestinationCreateWithData(destinationData, imageUTType, 1, NULL);
    CGImageDestinationSetProperties(destinationRef, (CFDictionaryRef)[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithFloat:desiredCompressionQuality], (NSString*)kCGImageDestinationLossyCompressionQuality, nil]);
    if (destinationRef != NULL)
    {
        CGImageDestinationAddImage(destinationRef, CGimage, NULL);

        if (CGImageDestinationFinalize(destinationRef))
        {
            result = [NSData dataWithData:(NSData*)destinationData];
        }
    }
    if (destinationData)
    {
        CFRelease(destinationData);
    }
    if (destinationRef)
    {
        CFRelease(destinationRef);
    }
    return result;
}

图像类型可以是 kUTTypePNG,但质量参数很可能不起作用。根据您的需要,它也可以是 kUTTypeJPEG2000。

于 2013-01-09T09:23:00.477 回答
0

快乐的编码...

请使用此逻辑,它不会降低文件质量,也不会降低图像高度宽度。

在不损失图像质量的情况下,您可以执行更好的增强。

在这里,您需要根据您的要求管理maxByte 。

它还会在执行此增强功能后释放内存。

这是UIImage 扩展...

extension UIImage {
func resize(fileName: String, maxByte: Int = 800000, folderName: String, completion: @escaping (UIImage?) -> ()) {
        DispatchQueue.global(qos: .userInitiated).async {
            guard let currentImageSize = self.jpegData(compressionQuality: 1.0)?.count else { return }//completion(nil) }
            
            var imageSize = currentImageSize
            var percentage: CGFloat = 1.0
            var generatedImage: UIImage? = self
            let percantageDecrease: CGFloat = imageSize < 10000000 ? 0.1 : 0.3
            while imageSize > maxByte && percentage > 0.5 {
                print("Performing \(percentage)")
                let canvas = CGSize(width: self.size.width * percentage,
                                    height: self.size.height * percentage)
                let format = self.imageRendererFormat
                format.opaque = false
                generatedImage = UIGraphicsImageRenderer(size: canvas, format: format).image {
                    _ in self.draw(in: CGRect(origin: .zero, size: canvas))
                }
                guard let generatedImageSize = generatedImage?.jpegData(compressionQuality: 1.0)?.count else { return }//completion(nil) }
                imageSize = generatedImageSize
                percentage -= percantageDecrease
            }
         
            completion(generatedImage)
        }
    }}
于 2021-06-21T06:23:43.390 回答