2012-07-08 59 views
1

我有以下代碼,可以根據觸摸的當前位置(X和Y座標)正確檢索用戶手指在圖像上觸摸的像素顏色(RGB)。所以,這段代碼工作正常,但不是視網膜顯示設備:如何從視網膜顯示設備中的CGImage獲取正確的像素?

-(void)drawFirstColorWithXCoord:(CGFloat)xCoor andWithYCoord:(CGFloat)yCoor 
{ 
    CGImageRef imageRef = [image CGImage]; //image is an ivar of type UIImage 
    NSUInteger width = CGImageGetWidth(imageRef); 
    NSUInteger height = CGImageGetHeight(imageRef); 
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
    unsigned char *rawData = malloc(height * width * 4); 
    NSUInteger bytesPerPixel = 4; 
    NSUInteger bytesPerRow = bytesPerPixel * width; 
    NSUInteger bitsPerComponent = 8; 
    CGContextRef context = CGBitmapContextCreate(rawData, width, height, 
              bitsPerComponent, bytesPerRow, colorSpace, 
              kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); 
    CGColorSpaceRelease(colorSpace); 

    CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef); 
    CGContextRelease(context); 

    //GET PIXEL FROM POINT 
    int index = 4*((width*round(yCoor))+round(xCoor)); 

    int R = rawData[index]; 
    int G = rawData[index+1]; 
    int B = rawData[index+2]; 

    NSLog(@"%d %d %d", R, G, B); 

    free(rawData); 
} 

我想知道我應該怎麼調整這個代碼,使其視網膜顯示設備的工作。

任何建議都會好起來的。在此先感謝您的幫助。

+0

愚蠢的問題:什麼是關於視網膜顯示器有什麼不同?爲什麼這個代碼不工作 - 你有什麼錯誤? – Rup 2012-07-08 19:22:38

+0

哦,我明白了,視網膜顯示器是iPhone 4S和更新的一項功能,至少在屏幕分辨率上翻倍。在普通iPhone中,只能有320 x 480 MAX的圖像,但在視網膜顯示設備中,最大值爲640 x 960,並且它們很適合屏幕。所以,在我的代碼中,我沒有考慮這個計算,因爲對於我來說,一個像素等於一個像素,這就是爲什麼在普通設備中我得到正確的像素,但在視網膜中事物放大,因此這個代碼檢索的像素不完全是在屏幕上觸摸這些設備。 – Renexandro 2012-07-08 21:26:12

+0

對,對不起 - 我的意思是視網膜設備編程有什麼不同。那麼你是說iOS正確地將輸入縮放到你在iPhones和舊iPad上採用的屏幕大小,而不是新的?這看起來很瘋狂。 – Rup 2012-07-09 00:26:15

回答

0

嘗試:

CGFloat scale = [[UIScreen mainScreen] scale]; 
NSUInteger bytesPerRow = width * scale * bytesPerPixel; 
+0

它應該是UIImage的規模。圖像的比例可能與屏幕的默認比例不一致。其實也沒有事件在屏幕上的意見。人們可以在2x視網膜屏幕上使用1x甚至0.5x縮放圖像或視圖。 – BlueWanderer 2013-10-06 15:16:16

相關問題