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. 二叉树层次遍历下到上,左到右python

    # 利用队列进行层次遍历就行class TreeNode: def __init__(self, x): self.val = x self.left = None self.right = None ...

  2. 附039.Kubernetes_v1.32.2高可用部署架构二

    部署组件 该 Kubernetes 部署过程中,对于部署环节,涉及多个组件,主要有 kubeadm .kubelet .kubectl. kubeadm介绍 Kubeadm 为构建 Kubernete ...

  3. 大数据之路Week10_day01 (通过直接创建Hfile文件的方式往Hbase中插入数据)

    package com.wyh.parctise; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.P ...

  4. 李沐动手学深度学习V2-chapter_convolutional-modern

    李沐动手学深度学习V2 文章内容说明 本文主要是自己学习过程中的随手笔记,需要自取 课程参考B站:https://space.bilibili.com/1567748478?spm_id_from=3 ...

  5. buuctf-web 解题过程

    [SUCTF 2019]Upload Labs 2 源码 // admin.php <?php include 'config.php'; class Ad{ public $cmd; publ ...

  6. postman 提示Http Status 400 -Bad Request

    Http Status 400 -Bad Request 将headers下面的选项全部勾选 新版postman自带的内容

  7. SpringBoot整合Dubbox(无XML配置)

    简介 Dubbox是当当网对阿里的Dubbo进行增强的一个分支.在使用springboot之后,我们发现很多配置并不一定要使用xml.这篇文章的目的是让你使用Dubbox时能像使用springboot ...

  8. Qt 给窗口绘制阴影

    文章目录 Qt 给窗口绘制阴影 前言 重载`paintEvent`法 QGraphicsDropShadowEffect方法 使用九图拼凑法 九宫格缩放阴影法 Qt 给窗口绘制阴影 前言 最近自定义一 ...

  9. MySQL超大表删除数据过程

    背景 笔者在公司负责公司的OpenAPI应用,估产生了调用审计的需求.对于存储这些AccessLog,虽然业界有很合适的架构和理论,奈何我司已成本优先,且作为toB的项目,调用量并不算特别大,每天也就 ...

  10. HTTP/1.1 优化

    避免发送 HTTP 请求 对于一些具有重复性的 HTTP 请求,比如每次请求得到的数据都一样的,我们可以把这对「请求-响应」的数据都缓存在本地,通过缓存技术减少请求次数. 客户端会把第一次请求以及响应 ...