当前位置:编程学习 > C#/ASP.NET >>

图形处理的大牛请进:盖章效果

我需要做一个盖章的效果,功能描述如下:

1、上传两张图片(扩展名自定),一张图片是订单信息,A4纸大小;一张图片是盖章(白底红章),约4*4cm

2、订单图片为背景图,将章的图片置于订单图片的右下角进行合并,合并的时候,章的图片白色部分(要允许近似色,有一个范围)设置为透明,红色部分(同样有一个范围)则和背景颜色合并

3、输出为合并好的图片(即盖好章的图片)

图片格式用什么都可以,jpg、bmp、gif、png 等等都可以 --------------------编程问答-------------------- 那啥,问问题不是这么问的吧,先说说自己的思路,大家帮忙想一想是没问题的,但是直接要好像有点问题吧。 --------------------编程问答--------------------

var img = (Bitmap) Image.FromFile("公章.jpg");
for (int x = 0; x < img.Width; x++)
for (int y = 0; y < img.Height; y++)
{
var color = img.GetPixel(x, y);
if (color.GetBrightness() > 0.8)
img.SetPixel(x, y, Color.White);
}
img.MakeTransparent(Color.White);
var img1 = Image.FromFile("背景图.jpg");
var g = Graphics.FromImage(img1);
g.CompositingMode = CompositingMode.SourceOver;
g.DrawImage(img, img1.Width - img.Width - 100, img1.Height - img.Height - 100);
g.Dispose();
img1.Save("合并图.jpg", ImageFormat.Jpeg);
--------------------编程问答--------------------
引用 1 楼 shenwenjie06 的回复:
那啥,问问题不是这么问的吧,先说说自己的思路,大家帮忙想一想是没问题的,但是直接要好像有点问题吧。


这个应该就是思路了吧:

2、订单图片为背景图,将章的图片置于订单图片的右下角进行合并,合并的时候,章的图片白色部分(要允许近似色,有一个范围)设置为透明,红色部分(同样有一个范围)则和背景颜色合并 --------------------编程问答--------------------
引用 2 楼 jshi123 的回复:

var img = (Bitmap) Image.FromFile("公章.jpg");
for (int x = 0; x < img.Width; x++)
for (int y = 0; y < img.Height; y++)
{
var color = img.GetPixel(x, y);
if (color.GetBrightness() > 0.8)
img.SetPixel(x, y, Color.White);
}
img.MakeTransparent(Color.White);
var img1 = Image.FromFile("背景图.jpg");
var g = Graphics.FromImage(img1);
g.CompositingMode = CompositingMode.SourceOver;
g.DrawImage(img, img1.Width - img.Width - 100, img1.Height - img.Height - 100);
g.Dispose();
img1.Save("合并图.jpg", ImageFormat.Jpeg);


谢谢,我去试一下 --------------------编程问答--------------------
引用 2 楼 jshi123 的回复:

var img = (Bitmap) Image.FromFile("公章.jpg");
for (int x = 0; x < img.Width; x++)
for (int y = 0; y < img.Height; y++)
{
var color = img.GetPixel(x, y);
if (color.GetBrightness() > 0.8)
img.SetPixel(x, y, Color.White);
}
img.MakeTransparent(Color.White);
var img1 = Image.FromFile("背景图.jpg");
var g = Graphics.FromImage(img1);
g.CompositingMode = CompositingMode.SourceOver;
g.DrawImage(img, img1.Width - img.Width - 100, img1.Height - img.Height - 100);
g.Dispose();
img1.Save("合并图.jpg", ImageFormat.Jpeg);


透明效果有了,不过红色没合并,跟盖章效果还是有很大区别的

不过还是谢谢您,给了我思路 --------------------编程问答-------------------- 把你的盖章图片和一个测试的背景图片贴上来看下。 --------------------编程问答--------------------
引用 2 楼 jshi123 的回复:

var img = (Bitmap) Image.FromFile("公章.jpg");
for (int x = 0; x < img.Width; x++)
for (int y = 0; y < img.Height; y++)
{
var color = img.GetPixel(x, y);
if (color.GetBrightness() > 0.8)
img.SetPixel(x, y, Color.White);
}
img.MakeTransparent(Color.White);
var img1 = Image.FromFile("背景图.jpg");
var g = Graphics.FromImage(img1);
g.CompositingMode = CompositingMode.SourceOver;
g.DrawImage(img, img1.Width - img.Width - 100, img1.Height - img.Height - 100);
g.Dispose();
img1.Save("合并图.jpg", ImageFormat.Jpeg);


img.SetPixel(x, y, Color.White); 这句是获取颜色,不是设置颜色,所以无效 --------------------编程问答-------------------- SetPixel是设置颜色。
for 循环这一段是扫描所有点,把接近白色的点设成白色,这样就可以用img.MakeTransparent(Color.White)把这些颜色镂空。不过上面这样处理是不准确的,要根据你的盖章图片调整。用lab或灰度值来判断颜色范围可以更准确,看下面这篇文章:
http://www.oliveragustin.com/background-subtraction-in-c/
如果基本只有红白两色的话,用直接判断颜色值的简单方法也可以处理掉。
--------------------编程问答--------------------

--------------------编程问答--------------------
引用 8 楼 jshi123 的回复:
SetPixel是设置颜色。
for 循环这一段是扫描所有点,把接近白色的点设成白色,这样就可以用img.MakeTransparent(Color.White)把这些颜色镂空。不过上面这样处理是不准确的,要根据你的盖章图片调整。用lab或灰度值来判断颜色范围可以更准确,看下面这篇文章:
http://www.oliveragustin.com/background-subtraction-in-c/
如果基本只有红白两色的话,用直接判断颜色值的简单方法也可以处理掉。


貌似 img.SetPixel(x, y, Color.White); 无效
就算改成黑色 img.SetPixel(x, y, Color.Black); 也没看到合并图有啥区别 --------------------编程问答-------------------- 改下两个地方:
if (color.GetBrightness() > 0.9) // 颜色阀值
g.DrawImage(img, img1.Width - img.Width - 500, img1.Height - img.Height - 350); // 公章位置
效果:
话说,如果你只有一个公章的话,用ps处理一下,对比度加大点,红色饱满些,做成png也不用在程序里镂空了。 --------------------编程问答-------------------- 背景图的文字被遮住了,不行的,要颜色合并后能看得到背景的文字

前面的订单的右下方文字较少,请使用如下订单,您就可以看到文字被遮住了:

--------------------编程问答-------------------- 我做出来是这样的(位置调整了下):

公章有红印的地方不是就应该遮住文字的吗,难道还有半透明效果?
这样调整只能调好一个公章,要做到完善的去背景算法还是蛮复杂的,建议你还是做一个透明的png图片比较容易些。
--------------------编程问答--------------------
引用 13 楼 jshi123 的回复:
我做出来是这样的(位置调整了下):

公章有红印的地方不是就应该遮住文字的吗,难道还有半透明效果?
这样调整只能调好一个公章,要做到完善的去背景算法还是蛮复杂的,建议你还是做一个透明的png图片比较容易些。


png文件也不行的,也只能做到透明,其他部分需要和背景颜色合并 --------------------编程问答-------------------- 不知道你要达到什么效果,要想做到以假乱真的效果,靠这个简单算法是做不到了。
就算用ps,也是有很多人工判断的成分。 --------------------编程问答-------------------- 其实我用来交水电煤的网站已经能做到这一点,请看盖章部分的颜色是合并的(右下方的数据是变化的):

--------------------编程问答-------------------- 我就是没研究出它是怎么做的 --------------------编程问答--------------------
直接画上去就行吧,最好印章是Png格式 --------------------编程问答-------------------- 你那个完全是把章PS过直接贴上合成的,不解释! --------------------编程问答--------------------
引用 18 楼 good_jobs 的回复:

直接画上去就行吧,最好印章是Png格式


PNG只是能设置哪些是透明的,现在透明问题已经解决了,就是颜色合并问题没解决 --------------------编程问答-------------------- 需要合并吗,直接画上去就行啊 --------------------编程问答-------------------- 直接绘制上去
也可以保存为png

http://bbs.csdn.net/topics/350217998 --------------------编程问答-------------------- 模仿Photoshop的正片叠底效果就可以做到
补充:.NET技术 ,  图表区
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,