3

現時点では少し混乱しています。スタックオーバーフローに関する初めてのポスターです。私は Objective C の初心者ですが、同僚から多くのことを学びました。私がやろうとしているのは、垂直ループごとに 1 ピクセルずつ水平方向にシフトする bmContext を垂直にトラバースすることです。いくつかのコードを次に示します。

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
    }
}

本当に水平方向に 1 単位シフトしてから、垂直方向のすべてのピクセルをチェックしてから、水平方向に再びシフトしているのでしょうか。と思いましたが、結果は少しずれているようです。Java と C# では、タスクを達成するのはかなり簡単でした。Objective C でこれを行うためのより簡単な方法を誰かが知っている場合は、私に知らせてください。前もって感謝します!

4

1 に答える 1

2

ピクセルに到達する方法がずれているようです。

私の理解が正しければ、画像内のすべてのピクセルを列ごとに反復処理するだけです。右?これはうまくいくはずです:

for (size_t i = 0; i < CGBitmapContextGetWidth(bmContext); i++)
{
    for (size_t j = 0; j < CGBitmapContextGetHeight(bmContext); j++)
    {
        int pixel = j * CGBitmapContextGetWidth(bmContext) + i;
        struct Color thisColor = {data[pixel + 1], data[pixel + 2], data[pixel + 3]};
    }
}
于 2012-07-18T20:27:50.950 に答える