2012-03-25 58 views
1

我正在嘗試爲iOS 5.1設備創建UIImage測試模式。目標UIImageView的尺寸爲320x240,但我試圖創建一個160x120 UIImage測試圖案(未來,非測試圖案圖像將是這種尺寸)。我希望盒子的上半部分是藍色的,下半部分是紅色的,但我看起來像是未初始化的內存會損壞圖像的底部。代碼如下:CGImageCreate測試模式不工作(iOS)

int width = 160; 
int height = 120; 
unsigned int testData[width * height]; 
for(int k = 0; k < (width * height)/2; k++) 
    testData[k] = 0xFF0000FF; // BGRA (Blue) 
for(int k = (width * height)/2; k < width * height; k++) 
    testData[k] = 0x0000FFFF; // BGRA (Red) 

int bitsPerComponent = 8; 
int bitsPerPixel = 32; 
int bytesPerRow = 4 * width; 
CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, &testData, (width * height * 4), NULL); 
CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();  
CGBitmapInfo bitmapInfo = kCGImageAlphaNoneSkipFirst; 
CGColorRenderingIntent renderingIntent = kCGRenderingIntentDefault; 

CGImageRef imageRef = CGImageCreate(width, height, bitsPerComponent, bitsPerPixel, bytesPerRow, 
            colorSpaceRef, bitmapInfo, provider, NULL, NO,renderingIntent); 

UIImage *myTestImage = [UIImage imageWithCGImage:imageRef]; 

這應該看起來像堆棧溢出的另一個例子。無論如何,我發現當我減小測試圖案的尺寸時,圖像的「損壞」部分會增加。另外奇怪的是,我在「腐敗」部分看到了紅線,所以看起來我並沒有弄亂組件的大小。我錯過了什麼?這感覺就像提供商的東西,但我沒有看到它。

謝謝!

添加了屏幕截圖。下面是它看起來像kCGImageAlphaNoneSkipFirst集:

AlphaSkipFirst

這裏是什麼樣子與kCGImageAlphaFirst:

enter image description here

回答

2

你的像素數據是在自動因此它被存儲在堆棧中:

unsigned int testData[width * height]; 

您必須從聲明此數據的函數返回。這使得函數的堆棧框架被彈出並被其他函數重用,從而覆蓋數據。

但是,您的圖像仍然指向堆棧中相同地址處的像素數據。 (CGDataProviderCreateWithData不會複製數據,它只是指它。)

要解決:使用mallocCFMutableDataNSMutableData爲堆上的像素數據分配空間。

+0

啊,我敢打賭就是這樣。我應該已經意識到發生了什麼事情,但我過於專注於獲取CGx功能。我會盡量驗證今晚的答案(Windows和C/C#在工作,但Mac和iOS在家中)。謝謝! – GrandAdmiral 2012-03-26 16:49:27

0

你的圖像包括字母,你再告訴系統忽略通過跳過最重要的位(即圖像的「B」部分)。嘗試將其設置爲kCGImageAlphaPremultipliedLast。

編輯:

現在我還記得字節序,我認識到,該程序可能是閱讀向後你的價值觀,所以你可能真正想要的是kCGImageAlphaPremultipliedFirst

+0

我試過你的建議,但我仍然看到圖像底部的腐敗。與kCGImageAlphaPremultipliedFirst更壞的像素是白色的顏色和kCGImageAlphaNoneSkipFirst更壞的像素是黑色的,如果有幫助。我也嘗試了kCGImageAlphaFirst,但是那裏有同樣的故事。我的意圖是32位像素(整數),每種顏色8位和8位阿爾法通道,可以或不可以使用。 – GrandAdmiral 2012-03-26 00:40:09

+0

可以顯示結果的圖片嗎?我確定你最後要預乘,所以如果現在不會造成問題的話,那麼最好保留它。您的圖像是BGRA,您可能需要將其製作爲RGBA才能在稍後獲得正確的顏色,但兩種版本都不是先使用alpha LAST。 – borrrden 2012-03-26 00:45:31

+0

ps你要麼有阿爾法或你不要,你不能混合搭配。 – borrrden 2012-03-26 00:50:06