2014-11-04 48 views
1

我在寫和IOS應用程序,我需要將CGImage另存爲JPEG文件。我控制壓縮的質量很重要。在Apple的Core Graphics/ImageIO框架中設置CGImageDestination中的JPEG壓縮質量時沒有效果

我寫了下面提供的功能。它的工作原理是,我得到一個JPEG文件。但是不管我爲壓縮設置什麼,我總是得到相同的結果。即文件大小始終相同。

誰能告訴我我做錯了什麼?

void CGImageWriteJPEG(CGImageRef image, NSString *path) { 
    NSMutableData * data = [[NSMutableData alloc] init]; 
    CGImageDestinationRef destination = CGImageDestinationCreateWithData((__bridge CFMutableDataRef)data, kUTTypeJPEG, 1, NULL); 

    float compression = .8; // What I put here does not seem to matter... 

    CFStringRef myKeys[1]; 
    CFTypeRef myValues[1]; 
    CFDictionaryRef myOptions = NULL; 
    myKeys[0] = kCGImageDestinationLossyCompressionQuality; 
    myValues[0] = CFNumberCreate(NULL, kCFNumberFloatType, &compression); 
    myOptions = CFDictionaryCreate(NULL, (const void **)myKeys, (const void **)myValues, 1, 
           &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); 


    CGImageDestinationSetProperties(destination, myOptions); 
    CGImageDestinationAddImage(destination, image, nil); 
    CGImageDestinationFinalize(destination); 



    [data writeToURL:[NSURL fileURLWithPath:path] atomically:NO]; 

    CFRelease(destination); 
    CFRelease(myOptions); 
    CFRelease(myValues[0]); 
} 
+0

更新的答案會'UIImageJPEGRepresentation'工作?多數民衆贊成我沒有問題使用。 – 2014-11-04 18:50:11

+0

我唯一擔心的是將CGImage轉換爲UIImage的代價。我必須爲數千張圖像執行此操作,因此效率至關重要。你知道關於轉換成本的任何信息嗎? – user2771609 2014-11-04 19:13:45

+0

我跑了一些測試,從CGImage到UIImage的轉換幾乎沒有成本,所以我想我會走這條路。謝謝您的幫助。我真的想知道我在做什麼CGImageDestination錯誤,但... – user2771609 2014-11-04 20:49:14

回答

2

嘗試通過myOptions到CGImageDestinationAddImage(),而不是

CGImageDestinationAddImage(destination, image, myOptions); 

這是我曾在迅速做的,所以我認爲這是相同的。例如

let imageProperties = [kCGImageDestinationLossyCompressionQuality as String: 0.8] 
CGImageDestinationAddImage(destination, image, imageProperties) 

爲SWIFT 3

let imageProperties = [kCGImageDestinationLossyCompressionQuality as String: 0.8] as CFDictionary 
CGImageDestinationAddImage(destination, image, imageProperties) 
+0

謝謝。我已切換到PNG,因爲事實證明,這對我來說是正確的壓縮類型,所以我無法驗證。不過謝謝。 – user2771609 2015-01-27 00:54:05

+0

我有同樣的問題,我可以證實這是行不通的。我確實有其他元數據,我將它添加到圖像 – 2015-02-06 14:05:59

+0

這是正確的答案。 https://developer.apple.com/reference/imageio/1464962-cgimagedestinationaddimage – 2016-11-03 19:20:46