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 ...
随机推荐
- 二叉树层次遍历下到上,左到右python
# 利用队列进行层次遍历就行class TreeNode: def __init__(self, x): self.val = x self.left = None self.right = None ...
- 附039.Kubernetes_v1.32.2高可用部署架构二
部署组件 该 Kubernetes 部署过程中,对于部署环节,涉及多个组件,主要有 kubeadm .kubelet .kubectl. kubeadm介绍 Kubeadm 为构建 Kubernete ...
- 大数据之路Week10_day01 (通过直接创建Hfile文件的方式往Hbase中插入数据)
package com.wyh.parctise; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.P ...
- 李沐动手学深度学习V2-chapter_convolutional-modern
李沐动手学深度学习V2 文章内容说明 本文主要是自己学习过程中的随手笔记,需要自取 课程参考B站:https://space.bilibili.com/1567748478?spm_id_from=3 ...
- buuctf-web 解题过程
[SUCTF 2019]Upload Labs 2 源码 // admin.php <?php include 'config.php'; class Ad{ public $cmd; publ ...
- postman 提示Http Status 400 -Bad Request
Http Status 400 -Bad Request 将headers下面的选项全部勾选 新版postman自带的内容
- SpringBoot整合Dubbox(无XML配置)
简介 Dubbox是当当网对阿里的Dubbo进行增强的一个分支.在使用springboot之后,我们发现很多配置并不一定要使用xml.这篇文章的目的是让你使用Dubbox时能像使用springboot ...
- Qt 给窗口绘制阴影
文章目录 Qt 给窗口绘制阴影 前言 重载`paintEvent`法 QGraphicsDropShadowEffect方法 使用九图拼凑法 九宫格缩放阴影法 Qt 给窗口绘制阴影 前言 最近自定义一 ...
- MySQL超大表删除数据过程
背景 笔者在公司负责公司的OpenAPI应用,估产生了调用审计的需求.对于存储这些AccessLog,虽然业界有很合适的架构和理论,奈何我司已成本优先,且作为toB的项目,调用量并不算特别大,每天也就 ...
- HTTP/1.1 优化
避免发送 HTTP 请求 对于一些具有重复性的 HTTP 请求,比如每次请求得到的数据都一样的,我们可以把这对「请求-响应」的数据都缓存在本地,通过缓存技术减少请求次数. 客户端会把第一次请求以及响应 ...