在C#中可以使用new Bitmap和Bitmap.clone的方法来获取一个Bitmap的备份,这两者实际上是有很大差别的。
代码如下:
Bitmap src = new Bitmap(@"C:\Users\Administrator\Desktop\樱花.png");
Bitmap a = new Bitmap(src);
BitmapData bgraData = a.LockBits(new Rectangle(0, 0, a.Width, a.Height), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
Bitmap r = new Bitmap(a.Width, a.Height);
BitmapData rData = r.LockBits(new Rectangle(0, 0, r.Width, r.Height), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
byte* pSrc = (byte*)bgraData.Scan0;
byte* pR = (byte*)rData.Scan0;
for (int j = 0; j < a.Height; j++)
for (int i = 0; i < a.Width; i++)
pR[0] = pSrc[0];//第一个像素点的b通道值为0
pR[1] = pSrc[1];
pR[2] = pSrc[2];
pR[3] = pSrc[3];
pR += 4;
pSrc += 4;
r.UnlockBits(rData);
a.UnlockBits(bgraData);
上述代码使用new Bitmap()的方法创建了src图像的备份对象,读取第一个像素的b通道值为0,alpha通道=0;
在看下面代码:
Bitmap src = new Bitmap(@"C:\Users\Administrator\Desktop\樱花.png");
Bitmap a = (Bitmap)src.Clone();
BitmapData bgraData = a.LockBits(new Rectangle(0, 0, a.Width, a.Height), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
Bitmap r = new Bitmap(a.Width, a.Height);
BitmapData rData = r.LockBits(new Rectangle(0, 0, r.Width, r.Height), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
byte* pSrc = (byte*)bgraData.Scan0;
byte* pR = (byte*)rData.Scan0;
for (int j = 0; j < a.Height; j++)
for (int i = 0; i < a.Width; i++)
pR[0] = pSrc[0];//第一个像素b通道值为25
pR[1] = pSrc[1];
pR[2] = pSrc[2];
pR[3] = pSrc[3];
pR += 4;
pSrc += 4;
r.UnlockBits(rData);
a.UnlockBits(bgraData);
上述代码使用src.clone()来创建了src的备份图像对象,但是读取第一个像素的b通道值为25,这里跟第一种方法就出现了偏差。
最后放上原图:
这张原图的第一个像素rgba的值分别为25,25,25,0
我们可以看到上述两种方法只有第二种是对的,因此在读取有透明度通道的PNG对象时,使用clone()方法,最好不要使用new Bitmap方法。
这里给自己的踩坑做个记录。
在C#中可以使用new Bitmap和Bitmap.clone的方法来获取一个Bitmap的备份,这两者实际上是有很大差别的。代码如下:Bitmap src = new Bitmap(@"C:\Users\Administrator\Desktop\樱花.png"); Bitmap a = new Bitmap(src); BitmapData bg...
01.以文件流的方式,假设在sdcard下有 test.
png
图片
FileInputStream fis =
new
FileInputStream("/sdcard/test.
png
");
Bitmap
bitmap
=
Bitmap
Factory.decodeStream(fis);
02. 以R文件的方式,假设 res/drawable下有 test.jpg文件
Bitmap
// 创建一个具有透明背景的
Bitmap
对象
Bitmap
target
Bitmap
=
new
Bitmap
(
bitmap
.Width,
bitmap
.Height);
// 设置Graphics对象的CompositingMode为SourceOver以支持透明度
using (Graphics graphics = Graphics.FromImage(target
Bitmap
))
graphics.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceOver;
// 设置透明度(0为完全透明,255为不透明)
float opacity = 0.5f;
// 创建颜色矩阵并设置透明度
ColorMatrix colorMatrix =
new
ColorMatrix();
colorMatrix.Matrix33 = opacity;
// 创建颜色矩阵属性
ImageAttributes imageAttributes =
new
ImageAttributes();
imageAttributes.SetColorMatrix(colorMatrix, ColorMatrixFlag.Default, ColorAdjustType.
Bitmap
);
// 绘制具有透明度的
PNG
图片
到目标
Bitmap
上
graphics.DrawImage(
bitmap
,
new
Rectangle(0, 0,
bitmap
.Width,
bitmap
.Height), 0, 0,
bitmap
.Width,
bitmap
.Height, GraphicsUnit.Pixel, imageAttributes);
// 保存目标
Bitmap
为
图片
文件
target
Bitmap
.Save("path_to_output_file.
png
");
Console.WriteLine("半透明
PNG
图片
绘制完成。");
在这个示例中,你需要将 `"path_to_
png
_file.
png
"` 替换为你实际的
PNG
图片
路径。首先,创建一个源
Bitmap
对象并加载
PNG
图片
。然后,创建一个目标
Bitmap
对象,它具有与源
Bitmap
相同的尺寸。
通过设置Graphics对象的CompositingMode属性为SourceOver,我们启用了透明度支持。然后,我们通过创建一个ColorMatrix对象,并将其第三行的值设置为所需的透明度来设置透明度。接下来,我们创建了一个ImageAttributes对象,并使用SetColorMatrix方法将ColorMatrix应用于图像。
最后,使用Graphics对象的DrawImage方法将具有透明度的
PNG
图片
绘制到目标
Bitmap
上,并保存目标
Bitmap
为
图片
文件。
请确保提供的
PNG
图片
具有透明度(即
图片
中的某些区域是透明的),以便在绘制时产生半透明效果。
bobo-teng:
深度学习AI美颜系列---AI瘦身效果算法揭秘
bobo-teng:
深度学习AI美颜系列---AI瘦身效果算法揭秘
bobo-teng:
深度学习AI美颜系列---AI瘦身效果算法揭秘
Trent1985:
深度学习AI美颜系列---AI瘦身效果算法揭秘
bobo-teng: