在不降低几何尺寸的情况下降低图像质量

时间:2012-06-08 10:35:40

标签: iphone objective-c ipad core-graphics quartz-graphics

我和UIImage有透明度。

我正在将UIImage的PNG表示上传到我的Web服务,该服务接受的数据少于800K。

所以基本上我想减小尺寸(不是几何的物理I.E.),即降低uimage的质量。

请不要指向我的Quartz指南

请不要提供使用UIImage IT支持透明度的JPEG表示

请不要提供更小的图像然后再缩放

我需要在UIImage中减少颜色如何通过Quartz实现它的任何想法?

在我尝试过后,创建了一个上下文和绘制的图像。玩过bytesPerRow但仍然失败,请帮助找到解决方案!

size_t width = CGImageGetWidth(image.CGImage);
size_t height = CGImageGetHeight(image.CGImage);
size_t bitsPerComponent = CGImageGetBitsPerComponent(image.CGImage);
size_t bytesPerRow = CGImageGetBytesPerRow(image.CGImage);

CGColorSpaceRef colorSpace = CGImageGetColorSpace(image.CGImage);
CGContextRef ctx = CGBitmapContextCreate(NULL, // Let CG allocate it for us
                                         width,
                                         height,
                                         bitsPerComponent,
                                         bytesPerRow,
                                         colorSpace,
                                         kCGImageAlphaPremultipliedLast); // RGBA
CGColorSpaceRelease(colorSpace);
CGRect rect = CGRectMake( 0, 0, CGImageGetWidth(image.CGImage), CGImageGetHeight(image.CGImage));
CGContextDrawImage( ctx, rect, image.CGImage);

CGImageRef newImg = CGBitmapContextCreateImage(ctx);
UIImage* compressedImage = [UIImage imageWithCGImage:newImg];
CGImageRelease(newImg);

CGContextRelease(ctx);

1 个答案:

答案 0 :(得分:0)

虽然JPEG不支持透明度,但实际上仍有JPEG选项。

获取当前的PNG并创建两个文件,一个有损JPEG文件和一个仅包含alpha的PNG  渠道。 ImageMagick非常适合这个顺便说一句。

然后将JPEG加载到UIImage中并将PNG作为掩码应用于UIImage,并且您有一个具有透明度的JPEG。嗯,有点。

我这里没有我的实施,如果我这样做,它是我的客户的项目的一部分,所以我将不愿意分享它,但本指南将帮助你开始:http://jeroendeleeuw.com/post/33638733049/how-to-mask-images-with-core-graphics-in-ios和参考我的尺寸减少量在80%附近。

祝你好运。