我正在编写一个类,用于通过Mono For Android将位图打印到Android中的便携式蓝牙打印机。我的类用于从流中获取像素数据,以便可以以正确的格式将其发送到打印机。现在这个类很简单,它只读取每个像素的高度,宽度和位数。
使用它读取的偏移量并将像素数据返回给打印机。现在我只使用每像素1位黑白图像。我正在使用的位图是Windows格式。
这是原始图片:
这是打印的结果,第一张图片没有任何变换。第二个是使用以下代码修改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];
}
我的问题是:
当我使用字节数组时,如何垂直翻转图像。我无法找到执行此操作的算法,所有示例似乎都建议使用我无法使用的已建立的图形库。
编辑:
我的位图保存在一维数组中,第一行是字节,第二行是第三,等等。
答案 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];
}
}