111,097
社区成员




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);//还原图片