以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  Bmp图转单色位图  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=149442)

--  作者:lgzhao
--  发布时间:2020/5/2 5:39:00
--  Bmp图转单色位图
老师好,

这个问题可能不属于Foxtable,但在下实在找不到其他高人可以请教,恳请在不麻烦的前提下给予点拨,谢谢!

问题描述:

我用Foxtable的GDI+绘图功能绘制并保存了bmp格式的图片,需要在热敏打印机上打印成标签。
因为这类打印机都是单色打印,连灰度都不支持。我直接打印这些图片的话,总是丢失象素点导致模糊不清。无论怎样设置打印机都没有明显效果。

所以需要把这个bmp图片转成单色的bmp位图
(不是分辨率问题,因为测试了其他单色位图是可以打印清楚的;GDI+也无法直接绘制单色位图)



我在网上查找了各种方法,没有VB.net相关的。几乎都是C#的代码,这些代码都采用了指针操作。

例如:
using System.Drawing.Imaging;
using System.Runtime.InteropServices;
 

public static Bitmap BitmapTo1Bpp(Bitmap img) {
  int w = img.Width;
  int h = img.Height;
  Bitmap bmp = new Bitmap(w, h, PixelFormat.Format1bppIndexed);
  BitmapData data = bmp.LockBits(new Rectangle(0, 0, w, h), ImageLockMode.ReadWrite, PixelFormat.Format1bppIndexed);
  byte[] scan = new byte[(w + 7) / 8];
  for (int y = 0; y < h; y++) {
    for (int x = 0; x < w; x++) {
      if (x % 8 == 0) scan[x / 8] = 0;
      Color c = img.GetPixel(x, y);
      if (c.GetBrightness() >= 0.5) scan[x / 8] |= (byte)(0x80 >> (x % 8));
    }
    Marshal.Copy(scan, 0, (IntPtr)((long)data.Scan0 + data.Stride * y), scan.Length);
  }
  bmp.UnlockBits(data);
  return bmp;
}
请问这段代码用VB如何实现? 如果不能实现,那么有没有其他的解决思路? 再次感谢!



我还尝试C#转为DLL给foxtable调用,但System.Drawing.Imaging这个命名空间不能在DLL类型中用。我对C#了解几乎是0,所以也没有头绪。



--  作者:有点酸
--  发布时间:2020/5/2 9:17:00
--  
C#代码转vb.net代码的工具: