【问题标题】:Algorithm to vertically flip a bitmap in a byte array垂直翻转字节数组中位图的算法
【发布时间】:2012-03-01 06:35:24
【问题描述】:

我正在编写一个类,用于通过 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];
        }

我的问题是:

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

编辑:

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

【问题讨论】:

  • 您是否正在寻找一种算法来交换矩阵中的数字、图像的像素,从而使图像旋转? flip是什么意思
  • @Adrian 是的,我需要修改数组,以便图像以正确的方向打印。我正在寻找可以在 Photoshop 或其他绘图程序中执行“垂直翻转”命令的算法。
  • 格式是否使位数组包含width*height*bits_per_pixel位?如果是这样,它是否以[first_row|second_row|...] 的形式组织?
  • @DanielFischer 是的,位数组包含第一行,然后是第二行等。它将始终采用每像素 1 位的格式。
  • @dmck,你有没有机会分享一下你是如何做到这一点的?更具体地说,将像素设置为适合打印机的格式?我真的被困在那里了。

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


【解决方案1】:

对于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)];
    }
}

如果每个像素多于一位,那就有点复杂了。

【讨论】:

    【解决方案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];
        }
    }
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2016-07-29
        • 2018-12-23
        • 2016-07-17
        • 2014-04-28
        • 1970-01-01
        • 2016-10-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多