2014-02-17 72 views
2

將我的應用創建的圖像保存到iPhone圖庫並嘗試恢復後出現問題。圖像數據是不同的。將圖片保存爲照片後獲取UIImage數據iOS中的圖庫

創建圖像

1.Code

我不使用阿爾法創建一個圖像(事實上,我得到了相同的結果,如果我使用阿爾法)

+ (UIImage *)createImageFromData:(NSData *)data { 
    uint8_t *imageData = (uint8_t *) calloc(WIDTH * HEIGHT * 3, sizeof(uint8_t)); 
    [data getBytes:imageData]; 
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
    CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, 
                   imageData, 
                   WIDTH * HEIGHT * 3, 
                   NULL); 
    CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault; 
    CGColorRenderingIntent renderingIntent = kCGRenderingIntentDefault; 

    CGImageRef imageRef = CGImageCreate(WIDTH, 
             HEIGHT, 
             8, // Bits per color component 
             3 * 8, // Bits per pixel : 1 pixel => 3 component 
             3 * WIDTH, // bytes per lign (1 byte = 1 component) 
             colorSpace, 
             bitmapInfo, 
             provider, 
             NULL, 
             NO, 
             renderingIntent); 
    UIImage *resultImage = [UIImage imageWithCGImage:imageRef]; 

    return resultImage; 
} 

2.Debug

在這裏,當我在方法結尾處打破時,我得到了lldb

(lldb) p (int)imageData[0] 
(uint8_t) $0 = 102 
(lldb) p (int)imageData[1] 
(uint8_t) $1 = 116 
(lldb) p (int)imageData[2] 
(uint8_t) $2 = 121 
(lldb) p (int)imageData[3] 
(uint8_t) $3 = 112 

保存圖像

- (IBAction)saveImage:(id)sender { 
    UIImageWriteToSavedPhotosAlbum(_image, self, 
    @selector(image:didFinishSavingWithError:contextInfo:), nil); 
} 

編輯:我嘗試的另一種方式來保存圖像:

CFDataRef pixelData = CGDataProviderCopyData(CGImageGetDataProvider(self.generatedImageView.image.CGImage)); 
uint8_t *data = (uint8_t *)CFDataGetBytePtr(pixelData); 
NSData *dataToSave = [NSData dataWithBytesNoCopy:data length:CFDataGetLength(pixelData) freeWhenDone:NO]; 

ALAssetsLibrary *assetLib = [[ALAssetsLibrary alloc] init]; 
[assetLib writeImageDataToSavedPhotosAlbum:dataToSave metadata:nil completionBlock:^(NSURL *assetURL, NSError *error) { 
    NSLog(@"%@", error); 
}]; 

DataToSave得到字節的正確數量,既errorassetURL是零在完成塊中,並且我看不到任何新照片在相冊

從圖書館

這是一個委託方法

​​

找回圖像從以前的圖像再回到數據

1.Code

+ (NSData *)createDataFromImage:(UIImage *)image { 
    CGImageRef imageRef = [image CGImage]; 

    CFDataRef pixelData = CGDataProviderCopyData(CGImageGetDataProvider(image.CGImage)); 
    uint8_t *data = (uint8_t *)CFDataGetBytePtr(pixelData); 

    return [NSData dataWithBytesNoCopy:data length:SIZE freeWhenDone:YES];; 
} 

2.Debug

現在我有什麼

(lldb) p (int)data[0] 
(int) $4 = 35 
(lldb) p (int)data[1] 
(int) $5 = 72 
(lldb) p (int)data[2] 
(int) $6 = 100 
(lldb) p (int)data[3] 
(int) $7 = 255 

alpha分量似乎與255的值......這不應該是一個問題嗎?但所有其他價值都發生了變化。在這一點上,我真的不知道如何獲得以前的價值!

編輯:它似乎是一個壓縮(當保存圖像)和解壓縮(當它回來)問題。 但是,我需要將相同的數據保存到照片相冊後。

回答

1

將圖像保存到相冊之前,圖像被壓縮爲JPEG。並且在加載時解壓縮。 JPEG是有損壓縮。因此,當您比較像素數據時,您在原始圖像和壓縮/解壓縮之間存在差異。

要保存無損嘗試以下操作:

+ (void)saveImageData:(NSData *)data { 
    ALAssetsLibrary *assetLib = [[[ALAssetsLibrary alloc] init] autorelease]; 
    [assetLib writeImageDataToSavedPhotosAlbum:data metadata:nil completionBlock:nil]; 
} 

有關無損保存/載入更多信息/從相冊請閱讀此線程Saving to/getting JPEG from user gallery without recompression

+0

在這種情況下,有沒有辦法救它不壓縮? – KIDdAe

+0

是的,我已經更新了我的答案。 – Avt

+0

@KIDdAe是我的回答有用嗎?你應該只要我試試看知道在這種情況下做:) – Avt

0

你不能管理文件進行比較的過程與保存照片相冊的圖像,因爲它會自動嵌入到您儲存的圖像幾個細節,比如關於地點,時間等細節......當你保存圖像的照片庫。所以在檢索後它不會和你的輸入圖像一樣。

+0

我不認爲那些有任何影響,當我回來的像素數據(因爲我有相同的字節數+ alpha通道)和我得到的值255從開始每4個字節(如果有它獲得了標題情況並非如此) – KIDdAe

相關問題