Foxtable(狐表)用户栏目专家坐堂 → Bmp图转单色位图


  共有2957人关注过本帖树形打印复制链接

主题:Bmp图转单色位图

帅哥哟,离线,有人找我吗?
lgzhao
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:小狐 帖子:304 积分:2091 威望:0 精华:0 注册:2017/11/19 9:46:00
Bmp图转单色位图  发帖心情 Post By:2020/5/2 5:39:00 [只看该作者]

老师好,

这个问题可能不属于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,所以也没有头绪。



 回到顶部
帅哥哟,离线,有人找我吗?
有点酸
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1093 积分:6682 威望:0 精华:0 注册:2013/7/1 9:05:00
  发帖心情 Post By:2020/5/2 9:17:00 [只看该作者]

C#代码转vb.net代码的工具:

 回到顶部