getPixelsで得られる画素値の順番はZ字順だった

d:id:Guernsey:20080216ではZ字順ではないらしいと書いていた.この投稿はZ字順であると確認した事についてのメモだ.

人為的に作成した画像を読み込んで確認したらいい.タテヨコ4の,16ピクセルある画像を作った.

 0 1 2 3
 4 5 6 7
 8 9 10 11
 12 13 14 15

OpenCVライブラリを利用して作った.ソースファイルenumrateImage.cppを示す.

#include <cv.h>
#include <highgui.h>
#pragma comment(lib,"cv.lib")
#pragma comment(lib,"cxcore.lib")
#pragma comment(lib,"highgui.lib")

int main(void)
{
    const int SIZE = 4;

    IplImage *enumrateImage = cvCreateImage(cvSize(SIZE,SIZE),IPL_DEPTH_8U, 1);

    for(int y = 0; y < SIZE; y++){
        for(int x = 0; x < SIZE; x++){
            ((uchar*)(enumrateImage->imageData + enumrateImage->widthStep*y))
                [x] = y * SIZE + x;
        }
    }

    cvSaveImage("enumrateImage.png", enumrateImage);

    cvReleaseImage(&enumrateImage);

    return 0;
}

出来上がった画像enumrateImage.png)が,想像通りに作られているかを,Paint.NET v3.22で確認した().

次はgetPixelsを実施する.NetBeans IDE6.0.1でファイルをデバッグ実行した.そのmainメソッドを示す.

public static void main(String[] args) {
    // 画像を読み込む
    final int SIZE = 4;
    File inputImageFile = new File("C:/enumrateImage.png");
    BufferedImage inputImage = null;
    try {
        inputImage = ImageIO.read(inputImageFile);
    } catch (IOException ex) {
        Logger.getLogger(searchImage.class.getName()).log(Level.SEVERE, null, ex);
    }

    int[] data = new int[SIZE * SIZE];
    inputImage.getData().getPixels(0, 0, SIZE, SIZE, data);
    data[1] = 4;
}

最終行にブレークポイントを設定し,IDE局所変数タブで変数dataを確認した().