急需解决C# PNG图片的重叠透明问题
///根据图片计算GraphicsPath路径。
///& lt;/summary & gt;
///& lt;param name = " img " & gtGif或png图片
///& lt;returns & gt图片不透明区域的路径
公共不安全静态GraphicsPath子GraphicsPath(Image img)
{
if (img == null)返回null;
//为我们的位图路径计算建立GraphicsPath。
graphics path g = new graphics path(FillMode。候补);
Bitmap bitmap =新位图(img);
int width =位图。宽度;
int height =位图。身高;
BitmapData bmData =位图。LockBits(新矩形(0,0,width,height),ImageLockMode。读写,像素格式。format 24 bpprgb);
byte* p = (byte*)bmData。Scan0
int offset = bmData。步幅宽度* 3;
int p0,p1,p2;//记录左上角0,0坐标的颜色值。
P0 = p[0];
p 1 = p[1];
p2 = p[2];
int start =-1;
//线坐标(Y列)
for(int Y = 0;Y & lt身高;Y++)
{
//行坐标(X行)
for(int X = 0;X & lt宽度;X++)
{
if(start = =-1 & amp;& amp(p[0]!= p0 || p[1]!= p1 || p[2]!= p2)) //如果前一个点不是不透明不透明。
{
start = X;//记录这一点
}
else if(start & gt;-1 & amp;& amp(p[0]= = P0 & amp;& ampp[1] == p1。& ampP[2] == p2)) //如果前一点不透明,透明。
{
g.AddRectangle(新矩形(start,Y,X - start,1));//将上一个矩形添加到
start =-1;
}
if(X = = width-1 & amp;& amp开始& gt-1) //如果前一个点不透明,最后一个点。
{
g.AddRectangle(新矩形(start,Y,X - start + 1,1));//将上一个矩形添加到
start =-1;
}
//if (p[0]!= p0 || p[1]!= p1 || p[2]!= p2)
// g.AddRectangle(新矩形(X,Y,1,1));
p+= 3;//下一个内存地址
}
p +=偏移量;
}
位图。解锁位(bmData);
位图。dispose();
//返回计算出的不透明图像路径。
返回g;
}
上述方法
下面的调用,如果你的控件是pictureBox1。
graphics path g = subgraphics path(picturebox 1。图片);
if (g == null)返回;
pictureBox1。Region =新区域(g);
PS,使用这段代码时,需要选择项目属性->;生成->;选中“允许不安全的代码”
不知道如何再和我打招呼。