我在Java中使用图像,我已经设计了超过100多个图像(.png)格式,它们都是透明的和黑色的。
问题是,现在我已经被要求改变绘图的颜色(黑色-到)。
我已经在谷歌搜索了许多代码剪辑,改变位图(像素)的图像,但我不猜测我必须做什么来匹配确切的像素,并取代特别是当图像,如果在透明模式.下面是在.Net的代码(C#)
Bitmap newBitmap = new Bitmap(scrBitmap.Width, scrBitmap.Height);
for (int i = 0; i < scrBitmap.Width; i++)
{
for (int j = 0; j < scrBitmap.Height; j++)
{
originalColor = scrBitmap.GetPixel(i, j);
if(originalColor = Color.Black)
newBitmap.SetPixel(i, j, Color.Red);
}
}
return newBitmap;
但它根本不匹配,我调试了一下,在整个文件中,没有Color(originalColor)变量的Red,绿色,Blue参数的值。
有人能帮忙吗?
3条答案
按热度按时间wixjitnu1#
这是我用Pixels做的解决方案。
附加源代码,以便可以尝试确切的并获得结果。
我有128 x128(宽x高)的样本图像。
//下面是示例图像和应用不同颜色x1c 0d1x的不同结果
e4eetjau2#
在我们讨论perfromance之前,让我们检查一下你的代码:
这里有两个错误:
1.您不与
Color.Black
进行比较,而是将**Color.Black
分配给originalColor
。1.你不处理透明度。
要检查透明度,您不应该比较
Color
对象,而是R,G,B值,让我们更改为:现在你会看到它可以工作,但处理每个图像需要很长时间:
GetPixel
和SetPixel
非常慢(主要是因为它们检查和计算每个调用的所有内容)。直接处理位图数据要好得多。如果你提前知道图像格式(并且每个图像都是固定的),那么你可以用更多的代码来做得更快:当然,这可以是further optimized,您可能需要处理不同的格式(see this list of pixel formats和this article关于其布局),但请将其视为使用位图的起点。
为了完整起见,这是没有直接访问位图数据的等价颜色。请注意,这应该很少使用,因为它非常慢。
另外请注意,这是考虑Alpha通道的比较(例如,50%透明绿色与30%透明绿色的颜色不同)。要忽略Alpha,您可以使用以下内容:
最后,如果你知道要替换的像素很少,你可以创建一个原始图像的原始副本(使用
Graphics.FromImage
创建一个上下文并绘制到source
位图中),这样你只会在有替换时调用SetPixel()
。在我看来,这里的任何优化都是无用的:如果您需要使用第一个解决方案的性能...koaltpgm3#
我会给予你另一个解决方案,因为这并不计算每一个像素。
它的短而简单。转换时间为62毫秒: