C# 图片处理详解

C# 图像处理(一) 下面是一个学习的过程,一个小的图像处理软件的C#编程过程,是我最近学习的过程。 大家可以一起共同学习。 1.打开图像 在项目中加一个button(text文本改成打开文件) 在form1中加入一个公共变量curbitmap private string curFilename; private System.Drawing.Bitmap cur... 阅读详情

本文主要介绍:获取图片的灰度/修改彩色图片为黑白图片/修改图片的对比度

Bitmap类:Bitmap对象封装了一个GDI+的位图,此位图由图形图像的像素,以及其属性组成。用于处理由像素数据定义的图像的对象,包括如下属性和方法

1.GetPixel方法和SetPixel方法:用于获取和设置图像的指定像素的颜色

2.PixelFormat属性:返回图像的像素格式

3.Palette属性:获取和设置图像所使用的颜色调色板

4.Height/Width属性:返回图像的高度和宽度

5.LockBits方法和UnlockBits是一个很好的方法这种方法可以使我们指定像素的范围来控制位图的任一部分,从而避免对位图的像素逐个进行处理,每调用一次LockBits都要调用UnlockBits进行解锁

BitmapData类:

1.Height/Width属性:被锁定位图的高度/宽度属性

2.PixelsFormat属性:数据实际像素格式

3.Scan0属性:被锁定数组的首字节地址,如果整个图像被锁定,则是图像的第一个字节地址

4.Stride属性:步幅,也称为扫描宽度

private string path=Application.StartupPath;
private byte[] mappdata;

private void button1_Click(object sender,EventArgs e)
{
    Image img=null;
    Bitmap map=null;
    //读取对应图片
    using(FileStream fs=new FileStream(path+"\\1.png",FileMode.Open))
    {
        img=Image.FromStream(fs);
    }
    map=(Bitmap)img;
    //将图片转换为黑白图片
    ChangeToGrayImg(map);
    //GetImageGrayData(map);
    //Bitmap map1=ChangeImageGrayOnPixel(map,10);
    //Bitmap map2=ChangeImageGrayOnMemory(map,100);
    //Bitmap map3=ChangeImageGrayOnPixel(map,10);
}
//修改图片为黑白的三种算法
private void ChangeToGrayImg(Bitmap map)
{
    int w=map.Width;
    int h=map.Height;
    Color pixel;
    for(int x=0;x<w;x++)
    {
        for(int y=0;y<h;y++)
        {
            pixel=map.GetPixel(x,y);
            int r=pixel.R;
            int g=pixel.G;
            int b=pixel.B;
            int result=0;
            int itype=2;
            switch(itype)
            {
                case 0://平均值法
                    result=((r+g+b)/3);
                    break;
                case 1://最大值法
                    result=r>g?r:g;
                    result=result>b?result:b;
                    break;
                case 2://加权平均值法
                    result=((int)(0.7*r)+(int)(0.2*g)+(int)(0.1*b));
                    break;
            }
        map.SetPixel(x,y,Color.FromArgb(result,result,result));
        }
    }
    //转换完成之后保存图片,这里没有重构,下面几个方法也能用
    MemoryStream ms=new MemoryStream();
    map.Save(ms,ImageFormat.Bmp);
    ms.Seek(0,SeekOrigin.Begin);
    byte[] buffer=new byte[ms.Length];
    ms.Read(buffer,0,buffer.Length);
    ms.Dispose();
    using(FileStream fs=new FileStream(path+"\\111.bmp",FileMode.CreateNew,FileAccess.Write))
    {
        fs.Write(buffer,0,buffer.Length);
    }
}
//根据图片获得图片的灰度数组
private void GetImageGrayData(Bitmap map)
{
    BitmapData bmpData=map.LockBits(new Rectangle(0,0,map.Width,map.Height),ImageLockMode.ReadOnly,PixelFormat.Format8bppIndexed);
    //获取扫描线的宽度
    int stride=bmpData.Stride;
    //显示宽度与扫描线宽度的间隙
    int offset=stride.Width;
    //获取bmpData的内存起始位置
    IntPtr iptr=bmpData.Scan0;
    //用stride宽度,表示这是内存区域的大小
    int scanBytes=stride*map.Height;
    //为目标分配内存
    mapdata=new byte[scanBytes];
    //copy内存中的数据到目标数组中
    System.Runtime.InteropServices.Marshal.Copy(iptr,mapdata,0,scanBytes);
}
//基于像素和基于内存修改图片的对比度
//1.基于像素修改图片的对比度
public Bitmap ChangeImageGrayOnPixel(Bitmap bitmap,int degree/*对比度的加深比例*/)
{
    Color curColor;
    int grayR,grayG,grayB;
    double Deg=(100.0+degree)/100.0;
    for(int i=0;i<bitmap.Width;i++)
    {
        for(int j=0;j<bitmap.Height;j++)
        {
            curColor=bitmap.GetPixel(i,j);    
            grayR=Convert.ToInt16((((curColor.R/255.0-0.5)*Deg+0.5))*255);
            grayG=Convert.ToInt16((((curColor.G/255.0-0.5)*Deg+0.5))*255);
            grayB=Convert.ToInt16((((curColor.B/255.0-0.5)*Deg+0.5))*255);
            if(grayR<0)
                grayR=0;
            else if(grayR>255)
                grayR=255;
            if(grayG<0)
                grayG=0;
            else if(grayG>255)
                grayG=255;
            if(grayB<0)
                grayB=0;
            else if(grayB>255)
                grayB=255;
            bitmap.SetPixel(i,j,Color.FromArgb(grayR,grayG,grayB));
        }
    }
    return bitmap;
}
 
//2.基于内存修改图片的对比度
public unsafe Bitmap ChangeImageGrayOnMemory(Bitmap bitmap,int degree)
{
    if(bitmap==null)
    {
       return null; 
    }
    double Deg=(100+degree)/100.0;
    int width=bitmap.Width;
    int height=bitmap.Height;
    int length=height*3*width;
    byte[] RGB=new byte[length];
    BitmapData data=bitmap.LockBits(new Rectangle(0,0,width,height),ImageLockMode.ReadWrite,PixelFormat.Format24bppRgb);
    IntPtr Scan0=data.Scan0;
    System.Runtime.InteropServices.Marshal.Copy(Scan0,RGB,0,length);
    double gray=0;
    for(int i=0;i<RGB.Length;i+=3)
    {
        for(int j=0;j<3;j++)
        {
            gray=(((RGB[i+j]/255.0-0.5)*Deg+0.5))*255.0;
            if(gray>255)
            {
                gray=255;
            }
            else if(gray<0)
            {
                gray=0;
            }
            RGB[i+j]=(byte)gray;
        }
    }
    System.Runtime.InteropServices.Marshal.Copy(RGB,0,Scan0,length);
    bitmap.UnlockBits(data);
    return bitmap;
}

 

C# IO 流操作详解:从文件读写到图片处理 C# 的 IO 流操作是文件处理的基础,掌握这些知识对开发任何类型的应用程序都至关重要。文本文件的读写:使用或File类的静态方法二进制文件操作:使用FileStream处理图片等二进制数据图片处理:结合 IO 流和实现图片操作性能优化:缓冲区使用、异步操作等技巧资源管理:始终使用using语句或手动关闭流异常处理:IO 操作容易受权限、文件存在性等因素影响编码问题:处理文本时指定正确的编码(如UTF-8安全性:验证文件路径,防止路径遍历攻击。 阅读详情

相关推荐

C#图片处理实战:5种Sizemode模式详解与适用场景对比

本文深入解析C# WinForms中PictureBox控件的5种SizeMode图片显示模式,包括Normal、StretchImage、AutoSize、CenterImage和Zoom。通过对比其对控件尺寸和图像显示的影响,并结合电商图片预览、证件照裁剪等实战场景,帮助开发者根据业务需求选择最合适的模式,确保图片不变形、完整显示或精准布局,提升应用的用户体验与开发效率。

weixin_29237635的博客 575

C#图片处理

通常对一幅图片的处理包括:格式变换,缩放(Scale),翻转(Rotate),截取(Clip),滤镜(Filter,如高斯模糊)等。 1,图片格式转换 .NET中的Image类是对图片对象的封装,我们可以通过操作Image类的实例来处理图片。通常我们有两种式可以得到Image实例: var imgPng = Image.FromFile(@"C:\temp\img\pp.png"); ...

weixin_30240349的博客 825

C#上传文件到七牛云对象存储Kodo:SDK使用与避坑指南

对象存储是现代应用处理文件存储的通用基础设施,它通过HTTP接口提供海量、高可用的存储能力,并附带CDN加速、数据处理等能力。在C#开发中,接入对象存储通常需要理解上传凭证(Token)的签发机制、选择合适的上传方式,并正确处理访问URL的拼接与签名。文章从对象存储的基本概念讲起,以七牛云Kodo(常称七牛云OSS)为例,介绍如何利用官方C# SDK完成图片和普通文件的上传,涵盖表单直传、分片上传、公有与私有空间URL生成、图片处理参数等实用技术细节,并总结常见错误码、依赖冲突、密钥安全等工程踩坑经验,帮助

weixin_29758911的博客 339

C# WinForm图片处理避坑指南:PictureBox显示OpenCV Mat时遇到的通道与像素格式问题详解

本文详细解析了在C# WinForm中使用PictureBox显示OpenCV Mat图像时常见的通道与像素格式问题,包括颜色异常、灰度图显示错误等。通过对比Mat与Bitmap的底层差异,提供实用的代码解决方案和性能优化技巧,帮助开发者高效处理图像转换与显示问题。

weixin_28725553的博客 215

C#生成Word文档:模板替换机制与Aspose.Words实战指南

在文档自动化处理中,Word文档的批量生成是很多系统绕不开的刚性需求。传统方式通过代码逐段构造段落和表格,导致排版样式与数据逻辑纠缠,维护成本高昂。实际上,docx文件本身就是一个包含XML结构的zip包,这为“模板+占位符”的生成方式提供了底层基础:将样式固定在Word模板中,程序只负责读取模板并替换动态数据。借助C#生态中的Aspose.Words等成熟库,开发者可以高效实现占位符替换、动态表格行填充、页眉页脚处理等能力,在报表、合同、批量单据等场景中大幅提升效率。同时,模板先行还能让业务人员直接参与格

weixin_32466193的博客 264

C#图片处理示例(裁剪,缩放,清晰度,水印)

原文:C#图片处理示例(裁剪,缩放,清晰度,水印)  前言 需求源自项目中的一些应用,比如相册功能,通常用户上传相片后我们都会针对该相片再生成一张缩略图,用于其它页面上的列表显示。随便看一下,大部分网站基本都是将原图等比缩放来生成缩略图。但完美主义者会发现一些问题,比如显示排版时想让相片缩略图列表非常统一、整齐、和美观,比如要求每张缩略图大小固定为120 x 90且不拉伸变形怎么办?再比如用户...

至情相遇的博客 2518

在麒麟系统上利用VSCODE和C#实现高效图片处理:SkiaSharp实战指南

本文详细介绍了在国产麒麟操作系统上,使用VS Code和C#语言,借助SkiaSharp库进行高效图片处理的实战指南。内容涵盖环境搭建、SkiaSharp安装避坑、核心图片处理流程(如解码、保存、缩放、裁剪、水印)以及麒麟系统下的专属调试与性能优化技巧,为跨平台C#开发提供了完整解决方案。

table的专栏 618

C#图像处理-图像的剪裁、复制、改变大小

本文展示C#语言实现:克隆的方法复制图片、GDI的方法图像剪裁 、Clone方法图像剪裁 、GDI的方法改变图像像素大小

qq_30725967的博客 1277

C#图片处理实战:从文件上传到存储,完整流程中的压缩与字节流转换(附WPF/GDI+代码)

本文详细解析了C#环境下图片处理的完整流程,从文件上传到存储,重点介绍了WPF前端与后端处理的高效协作。涵盖文件选择、前端预览、核心类型转换(如Bitmap与ImageSource互操作)、字节流处理以及智能压缩策略,并提供了实用的WPF/GDI+代码示例,帮助开发者优化图片处理性能。

weixin_30847939的博客 320

C#上位机Zebra打印方案:ZPL指令直连与驱动对比实战

在工业自动化与仓储物流场景中,条码标签打印是数据流转的关键环节。Zebra打印机凭借耐用特性和开放的ZPL指令体系,成为上位机集成的主流选择。ZPL是一种纯文本命令语言,通过串口、USB或TCP/IP 9100端口发送字节流即可精确控制打印内容,相比Windows驱动打印,它不依赖打印队列,格式控制更精准,批量打印更稳定,尤其适合与数据库联动的自动化产线。本文围绕C#上位机开发,介绍如何通过Zebra Setup Utilities完成设备配置,实现打印机连接、ZPL模板拼装、中文与图片处理、状态轮询等核心

weixin_34199764的博客 369

c#图片编辑软件 有简单的图片编辑功能

c#c#图片编辑软件 有简单的图片编辑功能图片编辑软件 有简单的图片编辑功能

C#图片处理避坑指南:从文件读取到上传,搞定BitmapImage转byte[]与高质量压缩的完整流程

本文详细介绍了C#中图片处理的完整流程,从文件读取到上传,重点解析了BitmapImage转byte[]与高质量压缩的常见问题与解决方案。通过实战代码示例,帮助开发者避免内存泄漏、格式丢失等常见陷阱,提升图片处理效率和质量。

weixin_30439067的博客 464

ESP32C6+ESP-IDF5.2实战:基于RS485的ModbusRTU从站开发与调试

本文详细介绍了基于ESP32C6和ESP-IDF5.2开发ModbusRTU从站的实战指南。涵盖硬件连接、协议实现、ESP-Modbus库移植、寄存器映射及调试技巧,帮助开发者快速构建稳定可靠的工业级RS485通信节点,并解决常见通信故障。

play7的博客 1188

C# OpenCVSharp Stylization实现自拍秒变油画艺术滤镜

在计算机视觉与图像处理中,艺术滤镜与图像风格化一直是开发者热衷探索的方向。C#开发者进行桌面图像应用开发时,常期望用轻量方式实现照片向油画、素描等艺术效果的转换。OpenCVSharp作为OpenCV的C#封装,提供了Stylization等风格化函数,其原理通过边缘保持滤波与域变换,在平滑色块的同时保留五官轮廓,获得类似油画厚涂的质感。相比基于神经网络的风格迁移,Stylization无需模型与GPU,几毫秒即可输出结果,非常适合动态影像预览、自拍美化及WinForms/WPF等桌面工具中的图片批量风格化

weixin_31742871的博客 314

mongoDB 数据莫名其妙的没了

问题 之前没有接触过mongoDB,然后接手一个项目使用的是MongoDB,我就跟着网上的教程搭建一个MongoDB的服务,并运行起来。 一开始没有啥问题,成功的把服务与MongoDB都启动以来,运行也没有问题。但是过了几天,我再次打开时发现,以前的数据神奇的消失了。我还在想,是有什么定时清除的么,还是什么原因导致崩了然后数据就被清理了。 查找原因 第一次遇到我没有在意,重启了一下MongoDB,...

技术熊的博客小窝 1万+

OpenCV机械臂手眼标定

这篇文章总结了手眼标定的原理,利用OpenCV自带的函数套用参数即可完成眼在手上和眼在手外两种标定。

Q先森的博客 6588

Qwen3-VL-8B与.NET生态集成:在C#应用中调用多模态AI服务

本文介绍了如何在星图GPU平台上自动化部署Qwen3-VL-8B多模态交互工具,并将其集成至.NET生态。通过该平台,开发者可快速在C#应用中调用该模型的API,实现图片内容识别与问答等典型应用场景,为桌面软件或管理系统增添智能图文理解能力。

weixin_35972981的博客 34

Qt Coordinate System

Qt 坐标系统Qt 坐标系统 数学基础 Qt坐标系统 视口 平移变换 缩放变换 setWindow 旋转 总结数学基础 矩阵与线性变换坐标系变换Qt坐标系统 视口和OpenGL一样,视口确定了画面在窗口(QWidget)中显示的区域,Qt的绘图坐标会完全映射到视口(View port)上,就像图示一样。默认情况下,窗口和视口是重合的,视口的大小覆盖了整个窗口。和OpenGL一样,Qt的QPa

unclerunning的博客 1151

黄聪:C#图片处理封装类(裁剪、缩放、清晰度、加水印、生成缩略图)有示例(转)

C#图片处理示例(裁剪,缩放,清晰度,水印) 吴剑 2011-02-20 原创文章,转载必需注明出处:http://www.cnblogs.com/wu-jian/   前言 需求源自项目中的一些应用,比如相册功能,通常用户上传相片后我们都会针对该相片再生成一张缩略图,用于其它页面上的列表显示。随便看一下,大部分网站基本都是将原图等比缩放来生成缩略图。但完美主义者会发

anlun的专栏 877

Hermes Agent 安装部署完全指南

Hermes Agent安装部署指南提供了两种安装方式:一键脚本安装和手动分步安装。该AI助手支持多平台运行(Linux/macOS/WSL2),核心功能仅需Git作为前置依赖,其他依赖如Python、Node.js等均由安装脚本自动处理。文档详细介绍了系统要求、依赖管理、配置目录结构、环境变量设置以及10个手动安装步骤,并提供了功能模块化选项,用户可根据需求选择安装语音交互、浏览器自动化等扩展功能。安装完成后可通过hermes doctor命令验证环境,并通过交互式向导完成初始化配置。

简简单单Onlinezuozuo 2619

PCL点云八叉树体素中心下采样,体素包含点索引提取

基于PCL octree实现点云八叉树计算,支持提取体素中心点进行点云下采样;根据任一点坐标,可以得到其在八叉树中的位置,输出对应体素内其余点的坐标或者索引

qq_48694523的博客 462

C#数字图像处理算法详解大全

C#数字图像处理算法详解大全 原文:C#数字图像处理算法详解大全 C#数字图像处理算法详解大全 网址http://dongtingyueh.blog.163.com/blog/#m=0 分享一个专业的图像处理网站(微像素),里面...

weixin_30326741的博客 976

【数据集5】土地利用类型数量预测数据LUH2

简介土地利用类型数量预测数据LUH2

WW、forever的博客 4546
上一篇: Zxing一维条码/二维条码生成与读取开发实例
下一篇: 文件读写操作(StreamWriter/StreamReader)
奇点码农
博客等级 码龄19年 60粉丝 140原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值