垂直翻转字节数组中位图的算法

时间:2012-02-08 19:12:48

标签: c# android algorithm image-processing xamarin.android

我正在编写一个类,用于通过Mono For Android将位图打印到Android中的便携式蓝牙打印机。我的类用于从流中获取像素数据,以便可以以正确的格式将其发送到打印机。现在这个类很简单,它只读取每个像素的高度,宽度和位数。

使用它读取的偏移量并将像素数据返回给打印机。现在我只使用每像素1位黑白图像。我正在使用的位图是Windows格式。

这是原始图片:

Original Image (Sent as Bitmap)

Result of printing and initial attempt at flip

这是打印的结果,第一张图片没有任何变换。第二个是使用以下代码修改BitArray的结果:

        BitArray bits = new BitArray(returnBytes);
        BitArray flippedBits = new BitArray(bits);

        for (int i = 0, j = bits.Length - 1; i < bits.Length; i++, j--)
        {
            flippedBits[i] = bits[j];
        }

我的问题是:

当我使用字节数组时,如何垂直翻转图像。我无法找到执行此操作的算法,所有示例似乎都建议使用我无法使用的已建立的图形库。

编辑:

我的位图保存在一维数组中,第一行是字节,第二行是第三,等等。

3 个答案:

答案 0 :(得分:2)

对于行顺序为width*height位的格式,您只需将位数组视为二维数组。

for(int row = 0; row < height; ++row) {
    for(int column = 0; column < width; ++column) {
        flippedBits[row*width + column] = bits[row*width + (width-1 - column)];
    }
}

如果每个像素有多个位,那将会有点复杂。

答案 1 :(得分:2)

你需要做这样的事情:

BitArray bits = new BitArray(returnBytes);
BitArray flippedBits = new BitArray(bits);

for (int i = 0; i < bits.Length; i += width) {
    for (int j = 0, k = width - 1; j < width; ++j, --k) {
        flippedBits[i + j] = bits[i + k];
    }
}

如果您需要倒置镜像,请使用以下代码:

BitArray bits = new BitArray(returnBytes);
BitArray flippedBits = new BitArray(bits);

for (int i = 0, j = bits.Length - width; i < bits.Length; i += width, j -= width) {
    for (int k = 0; k < width; ++k) {
        flippedBits[i + k] = bits[j + k];
    }
}

答案 2 :(得分:1)

你需要使用两个循环,第一个遍历所有行,第二个迭代每行内的像素。

for (int y = 0;  y < height;  y++)
{
    int row_start = (width/8) * y;
    int flipped_row = (width/8) * (height-1 - y);
    for (int x = 0;  x < width/8;  x++)
    {
        flippedBits[flipped_row+x] = bits[row_start+x];
    }
}