2012-06-08 233 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%左右。

祝你好運。