C# 如何实现图片边缘透明化

Dear200892 2021-05-24 11:24:09
WPF的应用程序,.NET Framework 4。
想实现图片四周的边缘透明化。
在网上找到了一个安卓端的例子,却不知道怎么转换成C#版本。
https://www.cnblogs.com/tangZH/archive/2018/03/15/8551632.html


原图

效果图
...全文
179 点赞 收藏 12
写回复
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
引用 11 楼 Eason0807 的回复:
我记得wpf有个透明度的属性,渐变改这个属性的值就行了吧
这个会让整张图片透明化,而不是边缘透明化。
回复
Eason0807 05-24
我记得wpf有个透明度的属性,渐变改这个属性的值就行了吧
回复
引用 9 楼 crystal_lz 的回复:
回复
引用 7 楼 Dear200892 的回复:
[quote=引用 4 楼 crystal_lz 的回复:]
透明颜色byB、byG、byR 、 byA?[/quote] 看来你似乎不知道什么是 A R G B 。。。。。
回复
引用 5 楼 xuzuning 的回复:
这个我复制到一个测试程序,透明区域的大小一直没改成功。
回复
引用 4 楼 crystal_lz 的回复:
透明颜色byB、byG、byR 、 byA?
回复
90e家 05-24
引用 2 楼 Dear200892 的回复:
[quote=引用 1 楼 90e家 的回复:]可以试一试虚化处理,处理边缘像素点就行了
没有这方面的知识储备[/quote]
回复
xuzuning 05-24
看这里https://blog.csdn.net/zgke/article/details/4532275 使用渐变透明画刷,直接像素修改 都提供了
回复
引用 3 楼 crystal_lz 的回复:
WPF里面有没有现成的我是不知道 不过写代码我就知道

Bitmap bmp = "你的图片";
//用32位argb模式锁定图片
BitmapData bmpData = bmp.LockBits(new Rectangle(Point.Empty, bmp.Size), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
byte[] byColor = new byte[bmpData.Height * bmpData.Stride];
//bmpData.Stride 一行像素所占用的字节数 != bmpData.Width * (位数 / 8) (不一定相等 Stride是内存对齐的 4倍对齐)
//bmpData.Scan0 像素数据在内存中的指针
Marshal.Copy(bmpData.Scan0, byColor, 0, byColor.Length);//将像素数据拷贝出来
for (int y = 0; y < bmp.Height; y++) {
    for (int x = 0; x < bmp.Width; x++) {
        byte byB = byColor[y * bmpData.Stride + (x * 3 + 0)];
        byte byG = byColor[y * bmpData.Stride + (x * 3 + 0)];
        byte byR = byColor[y * bmpData.Stride + (x * 3 + 0)];
        byte byA = byColor[y * bmpData.Stride + (x * 3 + 0)];
        //byA就是透明通道 你可以设置它改变该像素的透明值
        //至于边缘半径怎么计算 以及透明过度值 这就看你自己造化了吧
    }
}
Marshal.Copy(byColor, 0, bmpData.Scan0, byColor.Length);//将像素数据拷贝回去
bmp.UnlockBits(bmpData);//还原图片
byte byB = byColor[y * bmpData.Stride + (x * 3 + 0)]; byte byG = byColor[y * bmpData.Stride + (x * 3 + 1)]; byte byR = byColor[y * bmpData.Stride + (x * 3 + 2)]; byte byA = byColor[y * bmpData.Stride + (x * 3 + 3)]; 尴尬 。。。。。
回复
WPF里面有没有现成的我是不知道 不过写代码我就知道

Bitmap bmp = "你的图片";
//用32位argb模式锁定图片
BitmapData bmpData = bmp.LockBits(new Rectangle(Point.Empty, bmp.Size), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
byte[] byColor = new byte[bmpData.Height * bmpData.Stride];
//bmpData.Stride 一行像素所占用的字节数 != bmpData.Width * (位数 / 8) (不一定相等 Stride是内存对齐的 4倍对齐)
//bmpData.Scan0 像素数据在内存中的指针
Marshal.Copy(bmpData.Scan0, byColor, 0, byColor.Length);//将像素数据拷贝出来
for (int y = 0; y < bmp.Height; y++) {
    for (int x = 0; x < bmp.Width; x++) {
        byte byB = byColor[y * bmpData.Stride + (x * 3 + 0)];
        byte byG = byColor[y * bmpData.Stride + (x * 3 + 0)];
        byte byR = byColor[y * bmpData.Stride + (x * 3 + 0)];
        byte byA = byColor[y * bmpData.Stride + (x * 3 + 0)];
        //byA就是透明通道 你可以设置它改变该像素的透明值
        //至于边缘半径怎么计算 以及透明过度值 这就看你自己造化了吧
    }
}
Marshal.Copy(byColor, 0, bmpData.Scan0, byColor.Length);//将像素数据拷贝回去
bmp.UnlockBits(bmpData);//还原图片
回复
引用 1 楼 90e家 的回复:
可以试一试虚化处理,处理边缘像素点就行了
没有这方面的知识储备
回复
90e家 05-24
可以试一试虚化处理,处理边缘像素点就行了
回复
发动态
发帖子
C#
创建于2007-09-28

10.4w+

社区成员

.NET技术 C#
申请成为版主
社区公告

全世界最好的语言,没有之一.