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中的像素锁定到内存中,效率比遍历像素要高:

C#之Bitmap的更多相关文章

  1. [翻译]开发文档:android Bitmap的高效使用

    内容概述 本文内容来自开发文档"Traning > Displaying Bitmaps Efficiently",包括大尺寸Bitmap的高效加载,图片的异步加载和数据缓存 ...

  2. 【开源毕设】一款精美的家校互动APP分享——爱吖校推 [你关注的,我们才推](持续开源更新3)附高效动态压缩Bitmap

    一.写在前面 爱吖校推如同它的名字一样,是一款校园类信息推送交流平台,这么多的家校互动类软件,你选择了我,这是我的幸运.从第一次在博客园上写博客到现在,我一次一次地提高博文的质量和代码的可读性,都是为 ...

  3. Android Bitmap 和 ByteArray的互相转换

    Android Bitmap 和 ByteArray的互相转换 移动平台图像处理,需要将图像传给native处理,如何传递?将bitmap转换成一个 byte[] 方便传递也方便cpp代码直接处理图像 ...

  4. Android-Drawable、Bitmap、byte[]、资源文件相互转换

    我们在Android的开发中,经常可以遇到图片的处理,当中,有很多是 Bitmap.Drawable.byte[]和资源文件它们直接相互转换. 今天就此总结一下: 1.资源文件转为Drawable 2 ...

  5. bitmap对海量无重复的整数排序--转

    原文地址:http://blog.csdn.net/u013074465/article/details/46956295 现在有n个无重复的正整数(n 小于10的7次方),如果内存限制在1.5M以内 ...

  6. 基于位图(Bitmap、BitmapData)的图片处理方法(C#)

    目前操作位图的主流方法有三种: 1.基于Bitmap像素的处理方法,以GetPixel()和SetPixel()方法为主.方法调用简单,但是效率偏低. 2.基于内存的像素操作方法,以System.Ru ...

  7. android:布局、绘制、内存泄露、响应速度、listview和bitmap、线程优化以及一些优化的建议!

    1.布局优化 首先删除布局中无用的控件和层级,其次有选择地使用性能较低的viewgroup,比如布局中既可以使用RelativeLayout和LinearLayout,那我们就采用LinearLayo ...

  8. 获取View的截图-将View转换为Bitmap对象

    开发中,有时候需要获取View的截图来做动画来达到动画流程的目的 原理:将View的内容画到一个Bitmap画布上,然后取出 下面封装了一个从View生成Bitmap的工具类 /** * 将View转 ...

  9. bitmap解码

    #include <stdio.h> #include <stdlib.h> #include <string.h> #define BYTE unsigned c ...

  10. Bitmap转换成BitmapImage

    public BitmapImage BitmapToBitmapImage(System.Drawing.Bitmap bitmap) { MemoryStream ms = new MemoryS ...

随机推荐

  1. QT5笔记:11. Qt类库的模块

    基础模块:提供了Qt的最基本的功能 附加模块:实现了一些特定功能的提供了附加价值的模块 增值模块:商业版才有的模块,单独发布的提供额外附加价值的模块或工具 技术预览模块:一些处于开发阶段,但是可以作为 ...

  2. Linux - 内核版本升级

    测试时间:2024年5月15日,本文测试CentOS7.9的内核版本升级 测试结论:不要选择手动编译的方式!!! 一.使用第三方仓库(ELRepo) (1)升级前内核查看(3.10.0-1160.el ...

  3. Vue3路由进阶实战:深度解析参数传递与导航守卫核心技术

    一.路由参数传递的进阶应用技巧 1.1 路由配置与参数验证 // router/index.js { path: '/user/:userId(\\d+)', // 使用正则表达式限制只匹配数字 na ...

  4. 『Plotly实战指南』--绘图初体验

    今天,打算通过绘制一个简单的散点图,来开启我们 Plotly 绘图的初次尝试. 本文目的不是介绍如何绘制散点图,而是通过散点图来介绍Plotly 绘图的基础步骤. 1. 绘制散点图:初探 Plotly ...

  5. (C++实现)2-NAF

    (C++实现)2-NAF 前言 ‍ 任何一个非负整数,都有一个唯一的 NAF (Non-adjacent form) 表示. 因着课程的缘由,我不得不研究一下 NAF 是怎么实现的,也是现学现用. ‍ ...

  6. kali安装pdtm工具

    kali安装pdtm工具 前言 今天想安装一下pdtm工具集的,但过程中一直出现各种错误,找了几篇文章之后并没有找到解决方法,后解决之后写了这样一篇文章希望可以解决大家在安装过程中碰到的部分问题 介绍 ...

  7. yolov5 train报错:TypeError: expected np.ndarray (got numpy.ndarray)

    前言 mac intel 机器上,使用 yolov5 物体检测训练时报错:TypeError: expected np.ndarray (got numpy.ndarray) 这个错误信息 TypeE ...

  8. Supervisor-进程守护工具

    前言 Supervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启.它是通过fork/exec的方式把这些被管理 ...

  9. Thinkphp8多语言模式,语言包变量占位符实现方法。

    主要实现原理是sprintf()函数,更多占位符写法可以参考sprintf()的介绍. zh-cn.php ...... // 变量用 s% 作为占位符 'sold_books' => 'Sol ...

  10. JOKER 前端框架:自带云端可视化 IDE 的创新利器

    一.框架概述 在当今前端开发的多元化领域中,JOKER 前端框架犹如一颗璀璨的明星,以其独特而强大的功能,为开发者开辟了一条高效.便捷的创新之路. JOKER 不仅仅是一个普通的框架,它更是一个综合性 ...