我需要的效果是将两副透明的图像重叠夹在一起放在一张发光的桌子上。任何原来每张图像上黑的部分在结果中为黑,任何在原来每张图像上白的或是被清除的部分会让你透过它看到另外一幅图像上相同位置的部分。合成后整个图像都显得比较暗。急,望高手给出代码,谢谢
致歉:上次发出的类似的一个帖子因页面错误无法进入帖子,所以无法结贴给分,非常抱歉
原图1原图2效果图3
致歉:上次发出的类似的一个帖子因页面错误无法进入帖子,所以无法结贴给分,非常抱歉
原图1原图2效果图3
说个简单的方式
以前偶用于水印的
或许有用
比如吧 你要输出的和使用的结果图是一样的 w,h
那定义一个新的输出图
Bitmap result=new Bitmap(w,h);一个遍历获取颜色
for(int x=0;x<w-1;x++)
{
for(int y=0;y<h-1;y++)
{
Color c1=bitmap1.GetPixel(x, y); //获取原图1 x,y点的像素颜色
Color c2=bitmap2.GetPixel(x, y);
//先写图2的到结果图
result.SetPixel(x,y,c2);
//或者 把两个点的颜色值结合一起 写到图片上 嘿嘿 比如 白的至少有250以上 那就两个
//相加 减去一个255 取绝对值 ^_^ 自己搞下去咯 good luck
}
}
http://ufo-crackerx.blog.163.com/
修改图片透明度,注意,此方法为VB.NET中的指针拷贝法.C#中可稍加修改以提高性能.VB.NET ''' <summary>
''' 获取指定透明度的图像
''' </summary>
''' <param name="SourceBitmap">源图像</param>
''' <param name="OpaCityValue">透明度百分比</param>
''' <returns></returns>
''' <res></res>
Public Function TheTransparentBitmap(ByVal SourceBitmap As Bitmap, ByVal OpaCityValue As Double) As Bitmap
Try
'定义临时图片副本
Dim ForOutBitmap As New Bitmap(SourceBitmap)
'定义图像数据
Dim bmpDATA As New BitmapData
'将图像指定区域数据赋值
bmpDATA = ForOutBitmap.LockBits(New Rectangle(0, 0, SourceBitmap.Width - 1, SourceBitmap.Height - 1), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb)
'定义用来计算的Byte数组
Dim BTS(bmpDATA.Stride * bmpDATA.Height) As Byte
'将Byte设置为指定的图像数据
System.Runtime.InteropServices.Marshal.Copy(bmpDATA.Scan0, BTS, 0, BTS.Length - 1)
'为避免"除数不可为0"而设置的计算用变量
Dim tmpValue As Integer = 0
'因已经指定为32位ARGB模式,所以每4个排列为 B G R A,A即透明度
For I As Integer = 0 To BTS.Length - 4 Step 4
tmpValue = BTS(I + 3) * OpaCityValue
'修改A透明度
BTS(I + 3) = tmpValue
Next
'完成计算后将Byte组返回给指定的图像数据
System.Runtime.InteropServices.Marshal.Copy(BTS, 0, bmpDATA.Scan0, BTS.Length - 1)
'解锁该图像数据以使调用线程继续执行
ForOutBitmap.UnlockBits(bmpDATA)
'返回处理后的图像
Return ForOutBitmap
Catch ex As Exception
'如出现异常则返回空值
Return Nothing
End Try
End Function
C#/// <summary>
02 /// 获取指定透明度的图像 03 /// </summary> 04 /// <param name="SourceBitmap">源图像</param> 05 /// <param name="OpaCityValue">透明度百分比</param> 06 /// <returns></returns> 07 /// <res></res> 08 public Bitmap TheTransparentBitmap(Bitmap SourceBitmap, double OpaCityValue) 09 { 10 try { 11 //定义临时图片副本 12 Bitmap ForOutBitmap = new Bitmap(SourceBitmap); 13 //定义图像数据 14 BitmapData bmpDATA = new BitmapData(); 15 //将图像指定区域数据赋值 16 bmpDATA = ForOutBitmap.LockBits(new Rectangle(0, 0, SourceBitmap.Width - 1, SourceBitmap.Height - 1), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); 17 //定义用来计算的Byte数组 18 byte[] BTS = new byte[bmpDATA.Stride * bmpDATA.Height + 1]; 19 //将Byte设置为指定的图像数据 20 System.Runtime.InteropServices.Marshal.Copy(bmpDATA.Scan0, BTS, 0, BTS.Length - 1); 21 //为避免"除数不可为0"而设置的计算用变量 22 int tmpValue = 0; 23 //因已经指定为32位ARGB模式,所以每4个排列为 B G R A,A即透明度 24 for (int I = 0; I <= BTS.Length - 4; I += 4) { 25 tmpValue = BTS[I + 3] * OpaCityValue; 26 //修改A透明度 27 BTS[I + 3] = tmpValue; 28 } 29 //完成计算后将Byte组返回给指定的图像数据 30 System.Runtime.InteropServices.Marshal.Copy(BTS, 0, bmpDATA.Scan0, BTS.Length - 1); 31 //解锁该图像数据以使调用线程继续执行 32 ForOutBitmap.UnlockBits(bmpDATA); 33 //返回处理后的图像 34 return ForOutBitmap; 35 } catch (Exception ex) { 36 //如出现异常则返回空值 37 return null; 38 } 39 }
先将两张图做成 int[,,],使用 getPixel 的效率太低了,具体算法在我的资源里有。
对这两张图做低通。谁的值更低就取谁。
然后再用我的资源里的算法将它转换成 image。如果不想发生色偏,也可以将两张图做成灰度,然后进行比较。比较后,哪张图的值更低,就返回它的RGB值到当前坐标。