代码之家  ›  专栏  ›  技术社区  ›  Rodrigo

将GDI图形导出到BMP时如何获取“真实”颜色

  •  1
  • Rodrigo  · 技术社区  · 14 年前

    我正在开发一个ASP.NET Web处理程序,它返回生成内存中位图的图像 system.windows.forms.control 然后将呈现的控件导出为压缩到png的位图,使用方法 drawToBitmap() 。除了颜色分配的问题外,这些类现在已经完全工作了。例如,这是由Web处理程序生成的仪表。

    分配给仪表内部部件的颜色是红色( ff0000->code>)、黄色( ffff00->code>)和绿色( 00ff00->code>)但我只得到每种颜色的单调版本( cb100f->code>for red, ccb70d->code>for yellow and 04d50d->code>for green)。

    背景是包含颜色渐变的BMP文件。无论背景是作为样本的渐变、黑色画布、白色画布、透明画布,即使没有背景集,也会发生颜色丢失。

    • 黑色背景

    • 具有透明背景

    • 白色背景

    • 没有背景集

    • 像素格式为32bppargb

    我尝试过多种位图颜色深度、输出格式、压缩级别等,但似乎都不起作用。有什么想法吗?

    这是源代码的摘录:

    bitmap bmp=new bitmap(w,h,system.drawing.imaging.pixelformat.format32bpppargb);
    image bgimage=(image)httpContext.getGlobalResourceObject(“graphicResources”,“gaugeBackgroundImage”);
    canvas control_canvas=new canvas();//从控件继承
    …
    //制作仪表的例程
    …
    control_canvas.drawToBitmap(BMP,新矩形(0,0,w,h));
    < /代码> <然后使用该方法将呈现的控件导出为压缩为PNG的位图DrawToBitmap(). 除了颜色分配的问题外,这些类现在已经完全工作了。例如,这是由Web处理程序生成的仪表。

    The gauge

    分配给仪表内部部件的颜色为红色。(#FF0000)黄色#FFFF00和绿色(#00FF00)但是每种颜色我只得到一个暗淡的版本(#CB100F为了红色,#CCB70D黄色和#04D50D绿色的。

    背景是包含颜色渐变的BMP文件。即使没有背景集,无论背景是作为样本的渐变、黑色画布、白色画布、透明画布,都会发生颜色丢失。

    • 黑色背景

    With black background

    • 具有透明背景

    With a transparent background

    • 白色背景

    With a white background

    • 没有背景集

    Without a background set

    • 像素格式为32bppargb

    With pixelformat Format32bppArgb

    我尝试过多种位图颜色深度、输出格式、压缩级别等,但似乎都不起作用。有什么想法吗?

    这是源代码的摘录:

    Bitmap bmp = new Bitmap(w, h, System.Drawing.Imaging.PixelFormat.Format32bppPArgb);
    Image bgimage = (Image) HttpContext.GetGlobalResourceObject("GraphicResources", "GaugeBackgroundImage");
    Canvas control_canvas = new Canvas(); //inherits from Control
    ....
    //the routine that makes the gauge
    ....
    control_canvas.DrawToBitmap(bmp, new Rectangle(0, 0, w, h));
    
    4 回复  |  直到 13 年前
        1
  •  1
  •   Nate Zaugg    14 年前

    绘制颜色时,请检查以确保alpha通道也设置正确。如果你有一些阿尔法,它会与黑暗的背景混合,给你一个更暗的颜色。

        2
  •  1
  •   Jared Updike    14 年前

    你只用PNG试试这个吗?我用PNG(或JPEGS)解决了这个问题。在很久以前的浏览器中,iirc gifs消除了这个问题:

    请注意,我并不是说gifs会在很长一段时间内解决您的问题,但它可能会告诉您PNG的写/读是否是问题所在。试试看,试试BMP,试试别的。不要相信巴布亚新几内亚。您可以尝试将r g b值转储到一个日志文件中(或将其作为原始磁盘导入到Photoshop中),然后在写出位图之前查看数字。(使用) LockBits ;有关于获取位图中字节的代码教程)。

        3
  •  0
  •   Jared Updike    14 年前

    我刚意识到三角形指针上有亮黄色的部分,所以问题可能出在背景图像上。你是用原语画弧还是加载位图?根据输入格式的不同,您可能会遇到Gamma问题、颜色空间问题等,假设您正在为红色/黄色/绿色仪表部件使用图像。如果您正在使用图像,请尝试在代码中绘制这些形状。无论什么代码使黄色三角形获得明亮的颜色,所以使用相同的图像格式或画笔,或任何使黄色三角形起作用的东西。

        4
  •  0
  •   Rodrigo    13 年前

    Canvas是由第三方提供的类。我们在他们的包中发现了一个bug,他们发布了一个新版本,问题最终得到了解决。不管怎样,谢谢你抽出时间来!