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

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


原图

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

111,097

社区成员

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

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

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