3
我現在有點困惑,第一次在這裏發現堆棧溢出。我是客觀C的全新人物,但從我的同事那裏學到了很多東西。我想要做的是在每個垂直循環之後遍歷一個bmContext垂直水平移動1個像素。繼承人一些代碼:Objective C垂直掃描圖像中的像素
NSUInteger width = image.size.width;
NSUInteger height = image.size.height;
NSUInteger bytesPerPixel = 4;
NSUInteger bytesPerRow = width * bytesPerPixel;
NSUInteger bytesPerColumn = height * bytesPerPixel;
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef bmContext = CGBitmapContextCreate(NULL, width, height, 8, bytesPerRow, colorSpace, kCGBitmapByteOrderDefault | kCGImageAlphaPremultipliedFirst);
CGColorSpaceRelease(colorSpace);
CGContextDrawImage(bmContext, (CGRect){.origin.x = 0.0f, .origin.y = 0.0f, .size.width = width, .size.height = height}, image.CGImage);
UInt8* data = (UInt8*)CGBitmapContextGetData(bmContext);
const size_t bitmapByteCount = bytesPerRow * height;
struct Color {
UInt8 r;
UInt8 g;
UInt8 b;
};
for (size_t i = 0; i < bytesPerRow; i += 4) //shift 1 pixel
{
for (size_t j = 0; j < bitmapByteCount; j += bytesPerRow) //check every pixel in column
{
struct Color thisColor = {data[j + i + 1], data[j + i + 2], data[j + i + 3]};
}
}
在java中它看起來像這樣,但我對java版本沒有興趣,它只是強調我的真實問題。我只關心客觀的c代碼。
for (int x = 0; x = image.getWidth(); x++)
{
for (int y = 0; y = image.getHeight(); y++)
{
int rgb = image.getRGB(x, y);
//do something with pixel
}
}
我真的會將一個單位水平移動,然後檢查所有的垂直像素,然後再次水平移動?我以爲我是,但我的結果似乎有點關閉。在java和c#中實現任務相當簡單,如果有人知道在Objective C中做到這一點的更簡單的方法,請讓我知道。提前致謝!
嘿感謝快速回復,想說我用你的圖片作爲我自己對我的Steam帳號嘿嘿。我對你的答案有點困惑,我應該更具體。我不會替換像素的顏色或創建新圖像。我想要做的是計算我的垂直循環內有多少連續的顏色。對於每一行(它編寫和運行的代碼!)。我只是對我的循環感到困惑,我是通過查看所有垂直像素,然後水平移動1來真正檢查圖像。對困惑感到抱歉。 – Xav 2012-07-18 20:38:10
看到我編輯的答案爲解決方案 – Dima 2012-07-18 20:54:55
你釘了它!非常感謝! – Xav 2012-07-18 20:59:11