C#之Bitmap
SetPixel和GetPixel
private void btnC_Click(object sender, RoutedEventArgs e)
{
OpenFileDialog dia = new OpenFileDialog();
dia.Filter = "图像文件|*.png;*.bmp;*.jpg|所有文件|*.*";
dia.Multiselect = false;
if (dia.ShowDialog() == true)
{
var fileName=dia.FileName;
Task task = new Task(() =>
{
DealPic(fileName);
});
task.Start();
}
}
void DealPic(string fileName)
{
var image = new Bitmap(fileName);
for (int i = 0; i < image.Width; i++)
{
for (int j = 0; j < image.Height; j++)
{
var color = image.GetPixel(i, j);
var newColor = System.Drawing.Color.FromArgb(color.R, 0, 0);
image.SetPixel(i, j, newColor);
}
}
Dispatcher.Invoke(() =>
{
this.image.Source = BitmapToBitmapSource(image);
var bitmapImage = new BitmapImage();
bitmapImage.BeginInit();
bitmapImage.UriSource = new Uri(fileName);
bitmapImage.EndInit();
imageOri.Source = bitmapImage;
});
}
用Graphic绘制线
private void btnD_Click(object sender, RoutedEventArgs e)
{
Task task = new Task(DrawLines);
task.Start();
}
void DrawLines()
{
Bitmap bitMap;
using(bitMap=new Bitmap(256, 256))
{
using(var graph = Graphics.FromImage(bitMap))
{
using(var pen=new System.Drawing.Pen(System.Drawing.Color.Red, 3f))
{
graph.DrawLines(pen,new PointF[]
{
new PointF(0,0),
new PointF(10,10),
new PointF(100,10),
new PointF(100,100),
new PointF(200,50),
});
}
}
Dispatcher.Invoke(() =>
{
imageD.Source = BitmapToBitmapSource(bitMap);
});
}
}
LockBits和UnlockBits
private void btnE_Click(object sender, RoutedEventArgs e)
{
OpenFileDialog dia = new OpenFileDialog();
dia.Filter = "图像文件|*.png;*.bmp;*.jpg|所有文件|*.*";
dia.Multiselect = false;
if (dia.ShowDialog() == true)
{
var fileName = dia.FileName;
Task task = new Task(() =>
{
LockUnLock(fileName);
});
task.Start();
//LockUnLock(fileName);
}
}
void LockUnLock(string fileName)
{
Bitmap bmp = new Bitmap(fileName);
System.Drawing.Imaging.BitmapData bmpData = bmp.LockBits(new System.Drawing.Rectangle(0,0,bmp.Width,bmp.Height),
System.Drawing.Imaging.ImageLockMode.ReadWrite,
bmp.PixelFormat);
IntPtr ptr = bmpData.Scan0;//第一个像素的地址
int bytes = Math.Abs(bmpData.Stride //一行像素的宽度(以字节为单位)
) * bmp.Height;
byte[] rgbValues = new byte[bytes];
System.Runtime.InteropServices.Marshal.Copy(ptr,rgbValues,0,bytes);//将锁定到内存的BitmapData拷贝到rgbValues
for(int counter = 2; counter < rgbValues.Length; counter += 3)
{
rgbValues[counter] = 255;
}
System.Runtime.InteropServices.Marshal.Copy(rgbValues, 0, ptr, bytes);//将修改后的数据拷贝到内存
bmp.UnlockBits(bmpData);
Dispatcher.Invoke(() =>
{
imageE.Source = BitmapToBitmapSource(bmp);
});
}
直接将bitmap中的像素锁定到内存中,效率比遍历像素要高:
#####
愿你一寸一寸地攻城略地,一点一点地焕然一新
#####