2

これは、画像 (Bmp) の 8*8 ブロックの ArrayList を取得するための私のコードであり、機能していません。ここでのロジックの欠陥は何ですか? 'rows' はイメージの行数です。ビデオステガノグラフィプロジェクトを行っています。

        int x = 0;
        int colCount = 0;

        int yStart = 0;
        int yLimit = 8;

        for (x = 0;x < rows; x++)
        {
            while (yStart<yLimit)
            {
                imageBlock[x % 8, yStart % 8] = image_array[0].Data[x, yStart, 1];

                if (x % 8 == 7 && yStart % 8 == 7)
                {
                    blockList.Add(ForwardDCT(imageBlock));
                }

                yStart++;
            }

            if (x == rows - 1)
            { 
                x = 0;
                yLimit = yLimit + 8;
                //yStart = yStart + 8;
                colCount++;

                if (colCount == 100)
                {
                    break;
                }
            }

            if (yStart % 8 == 7)
            {
                yStart = yLimit - 8;
            }
        }
4

1 に答える 1

1

ロジックの欠陥は、単一imageBlockの があり、 を呼び出す前にその中のデータを数回上書きすることForwardDCT(imageBlock)です。

ループ構造をグリッド ステップ 8x8 に変更してから、グリッドの内容を にコピーし、すぐにimageBlock呼び出すループをさらに 2 つ作成する必要があります。ForwardDCT(imageBlock)

for (var blockRow = 0 ; blockRow < rows ; blockRow += 8) {
    for (var blockCol = 0 ; blockCol < yLimit ; blockCol += 8) {
        for (var r = 0 ; r != 8 ; r++) {
            for (var c = 0 ; c != 8 ; c++) {
                // Add a check to see that blockRow+r, blockCol+c
                // are inside the original image
                imageBlock[r][c] = image_array[0].Data[blockRow+r, blockCol+c, 1];
            }
        }
        blockList.Add(ForwardDCT(imageBlock));
    }
}
于 2013-10-19T11:01:32.850 に答える