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

C#之Bitmap的更多相关文章
- [翻译]开发文档:android Bitmap的高效使用
内容概述 本文内容来自开发文档"Traning > Displaying Bitmaps Efficiently",包括大尺寸Bitmap的高效加载,图片的异步加载和数据缓存 ...
- 【开源毕设】一款精美的家校互动APP分享——爱吖校推 [你关注的,我们才推](持续开源更新3)附高效动态压缩Bitmap
一.写在前面 爱吖校推如同它的名字一样,是一款校园类信息推送交流平台,这么多的家校互动类软件,你选择了我,这是我的幸运.从第一次在博客园上写博客到现在,我一次一次地提高博文的质量和代码的可读性,都是为 ...
- Android Bitmap 和 ByteArray的互相转换
Android Bitmap 和 ByteArray的互相转换 移动平台图像处理,需要将图像传给native处理,如何传递?将bitmap转换成一个 byte[] 方便传递也方便cpp代码直接处理图像 ...
- Android-Drawable、Bitmap、byte[]、资源文件相互转换
我们在Android的开发中,经常可以遇到图片的处理,当中,有很多是 Bitmap.Drawable.byte[]和资源文件它们直接相互转换. 今天就此总结一下: 1.资源文件转为Drawable 2 ...
- bitmap对海量无重复的整数排序--转
原文地址:http://blog.csdn.net/u013074465/article/details/46956295 现在有n个无重复的正整数(n 小于10的7次方),如果内存限制在1.5M以内 ...
- 基于位图(Bitmap、BitmapData)的图片处理方法(C#)
目前操作位图的主流方法有三种: 1.基于Bitmap像素的处理方法,以GetPixel()和SetPixel()方法为主.方法调用简单,但是效率偏低. 2.基于内存的像素操作方法,以System.Ru ...
- android:布局、绘制、内存泄露、响应速度、listview和bitmap、线程优化以及一些优化的建议!
1.布局优化 首先删除布局中无用的控件和层级,其次有选择地使用性能较低的viewgroup,比如布局中既可以使用RelativeLayout和LinearLayout,那我们就采用LinearLayo ...
- 获取View的截图-将View转换为Bitmap对象
开发中,有时候需要获取View的截图来做动画来达到动画流程的目的 原理:将View的内容画到一个Bitmap画布上,然后取出 下面封装了一个从View生成Bitmap的工具类 /** * 将View转 ...
- bitmap解码
#include <stdio.h> #include <stdlib.h> #include <string.h> #define BYTE unsigned c ...
- Bitmap转换成BitmapImage
public BitmapImage BitmapToBitmapImage(System.Drawing.Bitmap bitmap) { MemoryStream ms = new MemoryS ...
随机推荐
- 普通文本(.txt)篇章排版样式参考 [文档说明][日志]
把普通文本的篇章排版样式归总一下,供自己参考,当然如果读者能以此借鉴并学习到一些东西,是笔者最大的鼓励. 日志类 [1] 头标 [时间日期][备注][属性]内容 [2] [文件信息][符号][文件信息 ...
- Python装饰器:套层壳我变得更强了!
Python装饰器:套层壳我变得更强了 Python装饰器:套层壳我变得更强了 关于作用域和闭包可以聊点什么? 什么是作用域 什么是闭包 装饰器:套层壳我变得更强了 参考资料 昨天阅读了<Pyt ...
- AI与.NET技术实操系列(二):开始使用ML.NET
引言 在当今技术飞速发展的时代,机器学习(Machine Learning, ML)已成为推动创新和变革的核心力量.从智能推荐系统到自动化决策工具,ML的应用无处不在,深刻影响着我们的生活和工作方式. ...
- pandas 操作excel
一 Series 什么是series 相当于表格中的行和列,不同的设置可以按行或列排序 2.series 创建 空的series import pandas as pd s2=pd.Series() ...
- 线上测试木舟物联网平台之如何通过HTTP网络组件接入设备
一.概述 木舟 (Kayak) 是什么? 木舟(Kayak)是基于.NET6.0软件环境下的surging微服务引擎进行开发的, 平台包含了微服务和物联网平台.支持异步和响应式编程开发,功能包含了物模 ...
- Suspense和vue-async-manager
Suspense Suspense是 Vue3.x 中新增的特性, 那它有什么用呢?别急,我们通过 Vue2.x 中的一些场景来认识它的作用. Vue2.x 中应该经常遇到这样的场景: <tem ...
- css px em rem % vw vh vm 区别
前言 在传统项目开发中,我们只会用到 px.%.em 这几个单位长度,它们可以适用大部分项目的开发,并且拥有较好的兼容性. 而从 css3 开始,浏览器对逻辑单位的支持又提升了新的境界,增加了 rem ...
- nacos(八): sentinel——基本使用
一.概要 在微服务的架构中,流控是一个重要的任务.sentinel是阿里开源的流量治理组件,针对访问的"资源"或服务路径进行流控,内置了限流.熔断及系统负载保护等功能. senti ...
- [源码系列:手写spring] IOC第三节:Bean实例化策略InstantiationStrategy
主要内容 在第二节中AbstractAutowireCapableBeanFactory类中使用class.newInstance()的方式创建实例,仅适用于无参构造器. 大家可以测试一下,将第二节 ...
- 【软件】解决奥林巴斯生物显微镜软件OlyVIA提示“不支持您使用的操作系统”安装中止的问题
[软件]解决奥林巴斯生物显微镜软件OlyVIA提示"不支持您使用的操作系统"安装中止的问题 零.问题 资源在文末 问题如下,从奥林巴斯生物显微镜软件官网下载地址:https://l ...