关于GDI+在透明Bitmap上绘制时边缘有黑色重影的解决(WPF中)

最近在做软件工程课程的作业,其中有一个地方需要用到GDI+绘制图像并将句柄传给托盘当作托盘图标,可是因为楼主本人的强迫症比较严重,所以在测试时发现了一些小问题:

 红线中是托盘区最左侧的那个图标    

在底部为暗色时“41”与其右侧“38”看不出任何区别,但当底部用白色时就能看到“41”那个位置的图标黑边非常严重,这是为什么呢?


应该是在与GDI+对图层复合的处理,就像以前在JAVA Swing中一样,有透明度(就是半透明)的地方在输出到图像上时其颜色会被GDI+处理为与黑色混合。因此若是默认情况下,字体会有Cleartype效果,使边缘变得平滑,就是对边缘的像素进行扩散,用一些有透明度的像素在周围填充。这样在将这个bufferedimage导出为其他带透明度格式时就会出现上面的情况

为了避免这个只需要用最次的配置绘制就行:

 g.SmoothingMode = SmoothingMode.HighSpeed;
            g.CompositingQuality = CompositingQuality.HighSpeed;
            g.TextRenderingHint = TextRenderingHint.SingleBitPerPixelGridFit;

下面上整个过程:

        private Icon GetImageSourceByText(String Inf)
        {
            Drawing.Image bufferedimage;
            if (ico == IntPtr.Zero)
                bufferedimage = new Bitmap(35, 30, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
            else
                bufferedimage = Bitmap.FromHicon(ico);

            Graphics g = Graphics.FromImage(bufferedimage);
            g.Clear(Color.FromArgb(0, 255, 255, 255));
            g.SmoothingMode = SmoothingMode.HighSpeed;
            g.CompositingQuality = CompositingQuality.HighSpeed;
            g.TextRenderingHint = TextRenderingHint.SingleBitPerPixelGridFit;
            Pen pen = new Pen(Color.FromArgb(255, 255, 255, 255), 2);
            g.DrawString(Inf, DisIconFont, pen.Brush, new Drawing.Point(0,0));
            ico = (bufferedimage as Bitmap).GetHicon();

            g.Dispose();
            return Icon.FromHandle(ico);
        }

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值