【问题标题】:How to get the "real" colors when exporting a GDI drawing to bmp将 GDI 绘图导出到 bmp 时如何获得“真实”颜色
【发布时间】:2023-03-25 17:06:01
【问题描述】:

我正在开发一个 ASP.Net Web 处理程序,它返回生成内存中的图像System.Windows.Forms.Control,然后使用方法DrawToBitmap() 将呈现的控件导出为压缩为 PNG 的位图。除了颜色分配的问题外,这些课程现在已经完全正常工作了。例如,这是由 Web 处理程序生成的 Gauge。

分配给仪表内部的颜色是红色 (#FF0000)、黄色 (#FFFF00) 和绿色 (#00FF00),但我只得到每种颜色的单调版本(#CB100F 代表红色,#CCB70D 表示黄色,#04D50D 表示绿色)。

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

  • 黑色背景

  • 透明背景

  • 白色背景

  • 没有背景设置

  • 采用 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));

【问题讨论】:

  • 真的非常想要那种颜色...... ;-) 或者你的意思是“如何获得......”?
  • 我只想设置一种颜色并实际获取该颜色。这些只是一个例子,我当然不想在我的应用程序中使用圣诞树;)
  • 如果您将位图 (bmp) 直接保存到文件中会怎样?
  • 您没有向我们展示足够的代码。
  • Rodrigo,您可以通过将函数缩减到显示问题的最低限度来学到很多东西。您可以从头开始替换它,也许从绘制一个矩形开始。或者,只要问题仍然存在,您就可以剪掉大块。如果您通过此过程找出问题所在,请回来告诉我们,否则请发布您剩下的任何内容。

标签: c# bitmap gdi system.drawing color-mapping


【解决方案1】:

当您绘制颜色时,请检查以确保 Alpha 通道也设置正确。如果您有一些 alpha,它将与深色背景混合并为您提供更深的颜色。

【讨论】:

  • 无论有没有背景,结果都是一样的
  • 我一直在努力想出一个更好的答案。也许如果您发布了代码或将其发送给我以“修补”?
【解决方案2】:

您是否仅对 PNG 进行了尝试?我很久以前在浏览器中使用 PNG(或 JPEGS?)遇到了这个问题,但 IIRC GIF 消除了这个问题:

请注意,我并不是说 GIF 会长期解决您的问题,但它可能会告诉您 PNG 写入/读取是否是问题所在。试试看,试试 BMP,试试看。不要相信PNG。您可以尝试将 r g b 值转储到日志文件(或作为原始文件转储到磁盘并导入 Photoshop 并)在写出位图之前查看数字是多少。 (使用LockBits;有关于获取字节进出位图的代码教程)。

【讨论】:

  • @Mark:好点。真的,这些图像看起来像是有人在 Photoshop 中加载它们并按下 Ctrl+Y(CMYK 模式),这使得它们看起来像是从打印机出来的,消除了明亮的颜色。
【解决方案3】:

我刚刚意识到三角形指针上有非常亮的黄色部分,因此问题可能出在背景图像上。您是用图元绘制这些弧线还是加载位图?假设您使用红色/黄色/绿色仪表部分的图像,您可能会遇到伽玛问题、色彩空间问题等,具体取决于输入格式。如果您使用的是图像,请尝试在代码中绘制这些形状。任何代码使黄色三角形得到明亮的颜色,所以使用相同的图像格式或画笔或任何使黄色三角形工作的代码。

【讨论】:

  • 三角形用 Color.Gold 填充,但都不符合规定。
【解决方案4】:

Canvas 是由第三方提供的类。我们在他们的包中发现了一个错误,他们发布了一个新版本,问题终于解决了。无论如何感谢您的宝贵时间!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-04
    • 2013-04-12
    • 2021-08-09
    • 1970-01-01
    • 1970-01-01
    • 2011-07-09
    • 2013-06-05
    相关资源
    最近更新 更多