iOS - 在UIImage上绘图会大幅增加图像文件的大小

时间:2015-10-27 06:59:05

标签: ios objective-c image

我正在开发一个图像绘制应用程序,其中用户可以在图像上绘制草图。 但是在对图像进行草图绘制一段时间后,图像文件大小会急剧增加。 (例如,如果将一个1.6 mb的jpeg图像描绘一段时间,它将变为2.3 mb。尺寸会根据草图的数量而增加) 如果我使用Mac中的预览对图像进行相同数量的草图绘制,则根本不会影响图像文件大小。下面是编辑前后的示例图像(因为这里的图像上传限制是2 mb,我只做了少量的草图绘制)

Image before editing - 1.6 mb

Image after editing - 2 mb

不确定导致图像文件大小急剧增加的原因。 PFB代码片段。

- (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {

    currentLocation = [touch locationInView:containerImgVIew];
    UIGraphicsBeginImageContext(drawingView.frame.size);
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    [drawingView.image drawInRect:CGRectMake(0, 0, drawingView.frame.size.width, drawingView.frame.size.height) blendMode:kCGBlendModeNormal alpha:1];
    CGContextSetLineCap(ctx, kCGLineCapRound);
    CGContextSetLineWidth(ctx, slider.value);
    CGContextBeginPath(ctx);

    CGContextMoveToPoint(ctx, location.x, location.y);
    CGContextAddLineToPoint(ctx, currentLocation.x, currentLocation.y);
    CGContextStrokePath(ctx);

    drawingView.image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    location = currentLocation;
}

 //  touchesEnded method implemented same as touchesMoved

- (IBAction)saveButtonTapped:(id)sender
{
   UIGraphicsBeginImageContextWithOptions(_originalImageSize, YES, containerImgVIew.image.scale);

   CGContextSetBlendMode(UIGraphicsGetCurrentContext(), kCGBlendModeNormal);
   [containerImgVIew.image drawAtPoint:CGPointZero];

   CGFloat scale = _originalImageSize.width / drawingView.frame.size.width;
   CGContextScaleCTM(UIGraphicsGetCurrentContext(), scale, scale);
   [drawingView.layer renderInContext:UIGraphicsGetCurrentContext()];

   UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
   UIGraphicsEndImageContext();
   NSData *jpgData = UIImageJPEGRepresentation(viewImage, 1);
}

绘制一段时间后图像的文件大小远远大于原始图像大小。我试过png图像,但结果是一样的。

2 个答案:

答案 0 :(得分:1)

您可以在saveButtonTapped

中为 JPEG编码选择较低质量
NSData* jpgData = UIImageJPEGRepresentation(viewImage, 0.8);

像0.8这样的东西不应该太明显,应该真正改善文件大小。

答案 1 :(得分:0)

iPhone上的照片存储为JPEG文件。 JPEG文件始终是压缩的。 " ...不得使用压缩"这不是一个可以实现的要求。

使用设备相机拍摄的照片以约0.75质量(我估计)存储。当您从JPEG实例化UIImage时,磁盘上的压缩数据将被解压缩,并且在您编辑时RAM中会存在完整大小的未压缩图像。通过JPEG压缩和解压缩一次,这种内存中的副本会稍微降低。

您可以对内存中的未压缩图像进行编辑。保存更改后,再次将图像数据压缩为JPEG。您拨打UIImageJPEGRepresentation并选择压缩级别。选择0.75左右的值应该会为您加载的图像提供类似的文件大小。

每次使用JPEG格式压缩图像时,都会使图像略微降级。在高JPEG质量设置下,这些降级非常难以察觉。这种迭代性降级只是使用JPEG等有损压缩格式的一部分。