2012-06-08 181 views
2

我和UIImage具有透明度。降低图像质量而不降低其几何尺寸

我将UIImage的PNG表示上传到我的web服务,该服务接受的数据少于800K。所以基本上我想减小尺寸(不是几何体的几何形状但是物理的I.E.),即降低图像的质量。

请不要点我石英指南

请不提供使用的UIImage它不支持透明度的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); 
+0

听起来像是要压缩图像然后将其上传到服务器,或者将其上传到服务器可以处理的较小块中? – Luke

+0

是的,我想要质量差但仍具有透明像素的相同图像。我不想将图像分割成小块,而只是为了降低图像的质量,将其压缩。像保存在GIMP中时压缩图像一样的功能,例如 – deimus

+0

我会尝试分离alpha组件,然后应用jpeg压缩。另一端解压缩并应用aplha。 – MacGeek

回答

0

尽管JPEG不支持透明度,但实际上仍然存在JPEG选项。

取当前的PNG并创建两个文件一个有损JPEG文件和一个PNG只有alpha 通道。 ImageMagick很适合这个顺便说一句。

然后将JPEG加载到UIImage中,并将PNG作为掩码应用于UIImage,并使用透明度为JPEG。好吧,有点。

我在这里没有我的实施,如果我这样做,它是我的客户项目的一部分,所以我会被拒绝分享,但本指南将帮助您开始:http://jeroendeleeuw.com/post/33638733049/how-to-mask-images-with-core-graphics-in-ios并仅供参考我的尺寸减少幅度在80%左右。

祝你好运。