1

画像を印刷できるサーマルプリンターでモノクロームビットマップ画像を印刷していますが、右端に1本の垂直線が印刷されています。(ラインは右上から右下へ約2mmの太さ)

Bitmap image = new Bitmap(imagePath, false);
 int imageDepth = System.Drawing.Bitmap.GetPixelFormatSize(image.PixelFormat);

 Rectangle monoChromeBitmapRectangle = new Rectangle(0, 0, image.Width, image.Height);
 BitmapData monoChromebmpData = null;
 int stride = 0;

 monoChromebmpData = image.LockBits(monoChromeBitmapRectangle, ImageLockMode.ReadOnly, resizedImage.PixelFormat);
 IntPtr ptr = monoChromebmpData.Scan0;
 stride = monoChromebmpData.Stride;
 int numbytes = stride * image.Height;
 byte[] bitmapFileData = new byte[numbytes];
 Marshal.Copy(ptr, bitmapFileData, 0, numbytes);

 image.UnlockBits(monoChromebmpData);

 //Invert bitmap colors
  for (int i = 0; i < bitmapFileData.Length; i++)
  {
      bitmapFileData[i] ^= 0xFF;
  }

 StringBuilder hexaDecimalImageDataString = new StringBuilder(bitmapFileData.Length * 2);
 foreach (byte b in bitmapFileData)
    hexaDecimalImageDataString.AppendFormat("{0:X2}", b);

return hexaDecimalImageDataString;

ここでは、モノクロ ビットマップ イメージをバイト配列に変換し、バイト配列から 16 進文字列に変換しています。フォーラムでグーグル検索しましたが、この種のエラーについては議論されていません。(私はばかげた間違いをしているかもしれません)正確に私が間違いを犯している場所を誰かが提案できますか.

前もって感謝します。

乾杯、シヴァ。

4

3 に答える 3

0

monoChromebmpData.Stride * image.Heightつまり、画像の各行は正確にピクセル幅になりますがmonoChromebmpData.Stride * 8、おそらく元の画像のピクセル幅はそれよりも小さいため、右側に余分な垂直線があります。

次のようなことを試してください:

byte[] masks = new byte[]{0xff, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f};
int byteWidth = (image.Width+7)/8;
int nBits = imageWidth % 8;
byte[] actualBitmapFileData = new byte[byteWidth*image.Height];
int yFrom = 0;
for (int y=0; y<image.Height; y++) {
  for (int x=0; x<byteWidth-1; x++) {
    actualBitmapFileData[y*byteWidth + x] = (bitmapFileData[yFrom + x] ^ 0xFF);
  }
  int lastX = byteWidth - 1;
  actualBitmapFileData[y*byteWidth + lastX] = (bitmapFileData[yFrom + lastX] ^ 0xFF) & masks[nBits];
  yFrom += stride;
}

正しいサイズの with のactualBitmapFileData配列を作成します。bitmapFileData

すべての行の最後のバイトにはピクセルのみが含まれるnBitsため、どのピクセルにも対応しない余分なビットをクリアするために「マスク」する必要があることに注意してください。これは によって行われます& masks[nBits]。ここで、masksは使用する 8 つのマスクを含む 8 バイトの配列です。マスクの実際の値は、プリンターの動作方法によって異なります。余分なビットを に0または に設定する必要がある場合があり1、余分なビットは最上位または最下位のビットにすることができます。上記で使用されているマスク値は、最上位ビットが右にレンダリングされ、マスクされたビットが 0 に設定される必要があることを前提としています。プリンターの動作方法によっては、ビットを交換したり、マスクされたビットを0 ではなく 1 (マスクを補完し、|代わりにを使用&)

于 2013-08-21T14:18:41.660 に答える