【发布时间】:2020-05-24 23:16:35
【问题描述】:
我正在尝试将字节数组从 Raster 格式的图像(从左到右读取)转换为 Column 格式(从上到下读取)。
问题看起来很简单,我们有二维位数组(图像的宽度/高度)。在Raster 格式中,您从左到右读取位,在Column 格式中,您从上到下读取位。
我尝试这样做以支持ESC/POS 协议的Column 格式打印。我已经有了Raster 格式的图像,现在我正在尝试将其转换为Column 格式。
ESC/POSRaster 打印的文档:
ESC/POSColumn 打印的文档:
- https://reference.epson-biz.com/modules/ref_escpos/index.php?content_id=106#gs_lparen_cl_fn68
- https://reference.epson-biz.com/modules/ref_escpos/index.php?content_id=90
目前,我通过直接使用BitArray 处理位来进行转换。这个解决方案不是最优的,我认为有必要直接在Byte 中工作。
private byte[] ConvertRasterToColumnFormat(byte[] rasterData, int width, int height)
{
var finalHeight = height;
while (finalHeight % 8 != 0) finalHeight++;
var finalWidth = width;
while (finalWidth % 8 != 0) finalWidth++;
var rasterBitArray = new BitArray(rasterData);
var columnBitArray = new BitArray(finalHeight * finalWidth);
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
var rasterPosition = y * finalWidth;
var columnPosition = x * finalHeight;
rasterPosition += (x / 8) * 8;
columnPosition += (y / 8) * 8;
rasterPosition += 7 - x % 8;
columnPosition += 7 - y % 8;
var value = rasterBitArray[rasterPosition];
columnBitArray[columnPosition] = value;
}
}
var result = new byte[columnBitArray.Length / 8];
columnBitArray.CopyTo(result, 0);
return result;
}
.NET 测试:https://dotnetfiddle.net/NBRBgt
有人有更优化的解决方案吗?
【问题讨论】:
标签: c# image image-processing raster escpos