基于位图(Bitmap、BitmapData)的图片处理方法(C#)
目前操作位图的主流方法有三种:
1、基于Bitmap像素的处理方法,以GetPixel()和SetPixel()方法为主。方法调用简单,但是效率偏低。
2、基于内存的像素操作方法,以System.Runtime.InteropServices.Marshal.Copy()方法将数据变为非托管资源,操作后再写入内存。
3、基于指针的操作方式,效率最高,但是对使用者的能力有要求,能力不够者容易造成内存溢出。
第二种方法的一个实例:
//大图逐行遍历,y为行索引
for (var y = ; y < destHeight; y++)
{
//小图。把一行数据读入数组。第一个参数是起始位。
System.Runtime.InteropServices.Marshal.Copy(srcScan0 + y * srcStride, srcBuffer, , srcStride);
//大图。
System.Runtime.InteropServices.Marshal.Copy(dstScan0 + y * dstStride, dstBuffer, , dstStride); //大图逐列,rgb三色.(与源码相比做了修改,遍历长度减小,数值因为是灰度值,计算了变为了三分之一。)
for (var x = ; x < destWidth; x ++)
{
//字节总索引
int fullIndex = *x;
//相乘,再除以255。返回一个byte
//dstBuffer[x] = channelProcessFunction(ref srcBuffer[x], ref dstBuffer[x]);
var blendValue = channelProcessFunction(ref srcBuffer[fullIndex], ref dstBuffer[fullIndex]);
dstBuffer[fullIndex + ] = blendValue;
dstBuffer[fullIndex + ] = blendValue;
dstBuffer[fullIndex] = blendValue;
}
//写回托管内存
System.Runtime.InteropServices.Marshal.Copy(dstBuffer, , dstScan0 + y * dstStride, dstStride);
}
基于内存的像素操作
而对于灰度图的处理,可以使用调整gamma值的方式。对于灰度图处理的一个实例:
/// <summary>
/// 把小图片按照权重,重设gamma值,重新渲染。可得到加权重后的小图,背景为白色,非透明。
/// </summary>
/// <param name="image">小图片</param>
/// <param name="weight">权重</param>
/// <returns>加权重后的小图,背景为白色,非透明</returns>
private static Bitmap ApplyHeatValueToImage(Bitmap image, float weight)
{
//新建临时位图
var tempImage = new Bitmap(image.Width, image.Height, PixelFormat.Format32bppPArgb); using (var g = Graphics.FromImage(tempImage))
{
//把权重参数映射为[0.1-5],以便后面进行gamma的矫正。gamma值正常范围为1.0 - 2.2
//此处拓展,可以让色彩更加intense
//gamma值可用来进行灰度值层面的明暗矫正,改善失真。
////I want to make the color more intense (White/bright)
if (weight < 0.02f) weight = 0.02f;//最小0.02
weight *= 5f;
if (weight > 5f) weight = 5f; // Create ImageAttributes
var ia = new ImageAttributes(); //Gamma values range from 0.1 to 5.0 (normally 0.1 to 2.2), with 0.1 being the brightest and 5.0 the darkest.
//Convert the 100% to a range of 0.1-5 by multiplying it by 5
ia.SetGamma(weight, ColorAdjustType.Bitmap); //在image中 重绘
// Draw Image with the attributes
g.DrawImage(image,
new Rectangle(, , image.Width, image.Height),//这里如果size设小一点,可以对目标图像进行缩放。如果小于Graphics的尺寸,则会出现白边
, , image.Width, image.Height,//这里可以对源图像进行裁剪。
GraphicsUnit.Pixel, ia);
}
//New dot with a different intensity
return tempImage;
}
基于位图(Bitmap、BitmapData)的图片处理方法(C#)的更多相关文章
- [2011-3-9 12:59 ]As3.0中的位图(Bitmap/BitmapData)用法
1.位图使用(模糊)滤镜 //创建一个矩形区域的BitmapData var bmd:BitmapData = new BitmapData(80, 30, false, 0xefefef); //画 ...
- As3.0中的位图(Bitmap/BitmapData)编程
https://blog.csdn.net/wtuetnsrmh/article/details/12577929
- android图片处理方法
Java代码 //压缩图片大小 public static Bitmap compressImage(Bitmap image) { ByteArrayOutputStream baos = new ...
- android图片处理方法(不断收集中)
//压缩图片大小 public static Bitmap compressImage(Bitmap image) { ByteArrayOutputStream baos = new ByteArr ...
- Android 图片处理方法
//压缩图片大小 public static Bitmap compressImage(Bitmap image) { ByteArrayOutputStream baos = new ByteArr ...
- android图片处理方法(转)
//压缩图片大小 public static Bitmap compressImage(Bitmap image) { ByteArrayOutputStream baos = new ByteArr ...
- 【Android】Bitmap加载图片错误 java.lang.OutOfMemoryError: bitmap size exceeds VM budget
今天测试程序的时候出现下面的错误日志信息,程序当场挂掉 07-09 14:11:25.434: W/System.err(4890): java.lang.OutOfMemoryError: bitm ...
- 一种基于重载的高效c#上图片添加文字图形图片的方法
在做图片监控显示的时候,需要在图片上添加文字,如果用graphics类绘制图片上的字体,实现图像上添加自定义标记,这种方法经验证是可行的,并且在visual c#2005 编程技巧大全上有提到,但是, ...
- VC下加载多种格式图片的方法总结IPicture, CxImage, CImage(AtlImage), CPictureEx
尽管VC有提供相应的API和类来操作bmp位图.图标和(增强)元文件,但却不支持jpg.gif和png等格式的图片,而这几种格式却是常常要用到的.这里我给大家介绍两种办法来操作这些格式的图片. 1.用 ...
- iOS 图片裁剪方法
iOS 图片裁剪方法 通过 CGImage 或 CIImage 裁剪 UIImage有cgImage和ciImage属性,分别可以获得CGImage和CIImage对象.CGImage和CIImage ...
随机推荐
- Web应用多账号系统设计及微信扫码登录实现
Web应用多账号系统设计及微信扫码登录实现 1 前言概述 公司对功能测试,性能测试,安全测试等等都做了比较好的自动化后,急需要一个MIS系统来统一管理这些结果及报表. 此MIS系统特点如下: 仅内 ...
- CSharpGL(24)用ComputeShader实现一个简单的图像边缘检测功能
CSharpGL(24)用ComputeShader实现一个简单的图像边缘检测功能 效果图 这是红宝书里的例子,在这个例子中,下述功能全部登场,因此这个例子可作为使用Compute Shader的典型 ...
- 基于java的分布式爬虫
分类 分布式网络爬虫包含多个爬虫,每个爬虫需要完成的任务和单个的爬行器类似,它们从互联网上下载网页,并把网页保存在本地的磁盘,从中抽取URL并沿着这些URL的指向继续爬行.由于并行爬行器需要分割下载任 ...
- Spring的前期配置
1创建一个java项目,鼠标单击项目右键新建一个名为lib的文件夹 2在lib文件夹中考入Spring需要的配置文件(俗称jar包) 3 按Shift选中这些jar右键添加至构建路径 4选中src目录 ...
- CI Weekly #7 | Instgram/Quora 等大公司如何做持续部署?
终于,你们期待的 flow.ci iOS 项目持续集成 开始公测了.在这几个工作日, flow.ci 做了些许「功能优化」与「问题修复」,性能和体验都在持续优化中.比如: iOS 快速入门文档更新: ...
- 使用AWS亚马逊云搭建Gmail转发服务(一)
title: 使用AWS亚马逊云搭建Gmail转发服务(一) author:青南 date: 2014-12-30 15:41:35 categories: Python tags: [Gmail,A ...
- 【译】Unity3D Shader 新手教程(2/6) —— 积雪Shader
本文为翻译,附上原文链接. 转载请注明出处--polobymulberry-博客园. 如果你是一个shader编程的新手,并且你想学到下面这些酷炫的技术,我觉得你可以看看这篇教程: 实现一个积雪效果的 ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(45)-工作流设计-设计步骤
系列目录 步骤设计很重要,特别是规则的选择. 我这里分为几个规则 1.按自行选择(在起草时候自行选审批人,比较灵活) 2.按上级(无需指定,当时需要知道用户的上司是谁,可以在职位管理设置,或者在用户表 ...
- 一起学微软Power BI系列-使用技巧(2)连接Excel数据源错误解决方法
上一篇文章一起学微软Power BI系列-使用技巧(1)连接Oracle与Mysql数据库中,我们介绍了Power BI Desktop中连接Oracle和Mysql的方法,其实说到底还是驱动的问题, ...
- 理解 Neutron FWaaS - 每天5分钟玩转 OpenStack(117)
前面我们学习了安全组,今天学习另一个与安全相关的服务 -- FWaaS.理解概念 Firewall as a Service(FWaaS)是 Neutron 的一个高级服务.用户可以用它来创建和管理防 ...