2011-05-08 52 views
1

作爲this question的特例:從不支持的格式的UIImage獲取像素數據?

如果UIImage的格式不受支持,你會怎麼做?在我的情況下,我有一個單色的UIImage對象,我從文件中讀入。每個像素都有8位彩色(白色)數據,接着是8位alpha數據。該格式不受支持,但圖像在iPhone屏幕上顯示得很好。

但是,如引用問題中所述獲取像素數據將不起作用,因爲格式不受支持。那麼我能做什麼?

回答

0

會像這樣的工作,從本質上將圖像轉換爲單色位圖來操縱像素數據。

CGImageRef cgImage = [image CGImage]; 
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray(); 
    CGContextRef bitmapContext = CGBitmapContextCreate(NULL, CGImageGetWidth(cgImage), CGImageGetHeight(cgImage), 8, CGImageGetWidth(cgImage)*2, colorSpace, kCGImageAlphaLast); 
    CGColorSpaceRelease(colorSpace); 
    CGContextDrawImage(bitmapContext, CGRectMake(0, 0, CGBitmapContextGetWidth(bitmapContext), CGBitmapContextGetHeight(bitmapContext)), cgImage); 

    UInt8 *data = CGBitmapContextGetData(bitmapContext); 
    int numComponents = 2; 
    int bytesInContext = CGBitmapContextGetHeight(bitmapContext) * CGBitmapContextGetBytesPerRow(bitmapContext); 

    int white; 
    int alpha; 


    for (int i=0; i < bytesInContext; i+= numComponents) { 

     white = data[i]; 
     alpha = data[i+1]; 
    } 
+0

bitmapContext返回爲零,因爲它不受支持。我想我可以試着對它說謊,並聲稱我有RGB每像素16位,每個組件5位,並且沒有支持的alpha,並從那裏抓取數據。可能工作;肯定不會讓人滿意。 – 2011-05-08 19:55:21

0

您必須呈現爲已知/支持的像素格式。只需設置灰度或24BPP的位圖渲染目標,然後以1:1的縱橫比將圖像繪製到像素緩衝區中,因此不會調整大小。然後檢查已知的格式結果爲字節或字大小的像素。您只需要擔心iOS上的sRGB顏色空間,這樣可以使事情變得簡單,並且您可以直接從像素緩衝區中直接讀取像素值。