2011-12-01 88 views
1

我目前正在試圖端口一個Java程序到IOS這utilzes的BufferedImage的.setRGB方法單獨操作圖片像素,像這樣操縱一個UIImage

image.setRGB(x, y, color); 

在Objective-C,我的單個像素使用UIImage代替BufferedImage,我想知道的是,如果有一種做Java的setRGB的等價方法,或者我必須將圖像轉換爲字節數組,操縱像素,然後使用ImageWithData?

+0

查看http://stackoverflow.com/questions/1281210/can-i-edit-the-pixels-of-the-uiimages-property-cgimage –

回答

2

你必須將圖像轉換轉換爲位圖,在位圖上使用setRGB,然後用位圖創建圖像並繪製圖像或將新圖像分配給圖像視圖內容。

爲什麼?在應用的ARM代碼無法訪問GPU的另一側,像素可能呈不透明格式。

0

下面是如何從圖像獲取像素數據的一個例子: http://developer.apple.com/library/mac/#qa/qa1509/_index.html

然後你可以改變數據的顏色是這樣的:

// Set the color of the pixel to 50% grey + 50% alpha 
data[offset+0] = 128; 
data[offset+1] = 128; 
data[offset+2] = 128; 
data[offset+3] = 128; 
+1

那麼,你可以操縱你回來的數據,但那不改變圖像。 –

0

這裏是我最終使用設置像素

-(void)setPixel:(UInt8*)buffer width:(int)width x:(int)x y:(int)y r:(int)r g:(int)g b:(int)b 
{ 
    buffer[x*4 + y*(width*4)] = r; 
    buffer[x*4 + y*(width*4)+1] = g; 
    buffer[x*4 + y*(width*4)+2] = b; 
} 
1

您可以使用下面的方法來訪問像素和操縱他們

-(UIImage*) applyFilterContext:(void*)context 
{ 
CGImageRef inImage = self.CGImage; 
CFDataRef m_DataRef = CGDataProviderCopyData(CGImageGetDataProvider(inImage)); 
UInt8 * m_PixelBuf = (UInt8 *) CFDataGetBytePtr(m_DataRef); 

int length = CFDataGetLength(m_DataRef); 

for (int i=0; i<length; i+=4) 
{ 
    filterGreyScale(m_PixelBuf, i, context); 
} 


//Create Context 
CGContextRef ctx = CGBitmapContextCreate(m_PixelBuf, 
             CGImageGetWidth(inImage), 
             CGImageGetHeight(inImage), 
             CGImageGetBitsPerComponent(inImage), 
             CGImageGetBytesPerRow(inImage), 
             CGImageGetColorSpace(inImage), 
             CGImageGetBitmapInfo(inImage) 
             ); 

CGImageRef imageRef = CGBitmapContextCreateImage(ctx); 
CGContextRelease(ctx); 
UIImage *finalImage = [UIImage imageWithCGImage:imageRef]; 
CGImageRelease(imageRef); 
CFRelease(m_DataRef); 

return finalImage; 

}

//操縱像素代碼到灰度值

void filterGreyScale (UInt8 *pixelBuf, UInt32 offset, void *context) 
{ 

int r = offset; 
int g = offset+1; 
int b = offset+2; 

int red = pixelBuf[r]; 
int green = pixelBuf[g]; 
int blue = pixelBuf[b]; 

uint32_t gray = 0.3 * red + 0.59 * green + 0.11 * blue; 

pixelBuf[r] = gray; 
pixelBuf[g] = gray; 
pixelBuf[b] = gray; 

}