C# DrawImage 多出了色阶值 255的像素

梦琪小生 2017-12-07 03:16:17
 
Bitmap src= new Bitmap(......原图路径);
Bitmap bit = new Bitmap(src.Width, src.Height);
Graphics g = Graphics.FromImage(bit);
g.DrawImage(src, new Rectangle(0, 0, BitmapInfo.Width, BitmapInfo.Height), new Rectangle(0, 0, BitmapInfo.Width, BitmapInfo.Height), GraphicsUnit.Pixel);


图就是用软边画笔画了一笔,带柔软度的。单一色阶 128
然后这样的图DrawImage绘制到一张空图上,会在原先软边的边缘出现一两圈透明度1 , 2 的色阶值为255的像素。只是DrawImage,什么都没做为什么会产生新色阶。虽然透明度很低,看不出来,但数据确实变了
以下方法获取图片的最高色阶值:

private unsafe int GetMax(Bitmap bit)
{
BitmapData bitdata = bit.LockBits(new Rectangle(0, 0, bit.Width, bit.Height), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
byte* bitByte = (byte*)bitdata.Scan0;
int h = bit.Height;
int w = bit.Width;
int max = 0;
for (int j = 0; j < h; ++j)
{
for (int i = 0; i < w; ++i)
{
if (bitByte[0] > max)
{ max = bitByte[0]; }
bitByte += 4;
}
}

bit.UnlockBits(bitdata);
return max;
}

这是素材图:
...全文
214 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
梦琪小生 2018-06-21
  • 打赏
  • 举报
回复
引用 3 楼 xuzuning 的回复:
这与 DrawImage 内部算法有关(在色点间做了过渡处理)
若你想不受他的影响,可以直接通过 BitmapData 做数据迁移

是的,目前只能是对图片像素进行处理了。
xuzuning 2017-12-11
  • 打赏
  • 举报
回复
这与 DrawImage 内部算法有关(在色点间做了过渡处理) 若你想不受他的影响,可以直接通过 BitmapData 做数据迁移
梦琪小生 2017-12-11
  • 打赏
  • 举报
回复
引用 1 楼 assky124 的回复:
可能Bitmap对象默认是32位颜色的。 换成Image对象试试呢,或者直接指定Bitmap 的 PixelFormat 试试
图A是带Alpha的,图B是新New的,所以也都是32位的,应该和这个没关系吧
assky124 2017-12-07
  • 打赏
  • 举报
回复
可能Bitmap对象默认是32位颜色的。 换成Image对象试试呢,或者直接指定Bitmap 的 PixelFormat 试试

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧