C# JPG与Bitmap互相转换

一、JPG转Bitmap

要实现读取一个JPG文件并将其保存为BMP格式,你可以使用System.Drawing命名空间提供的类,代码如下:

using System.Drawing;
using System.Drawing.Imaging;

//JpgToBmp
public static void ConvertJpgToBmp(string inputFile, string outputFile)
{
    // 读取JPG文件
    using (var originalImage = Image.FromFile(inputFile))
    {
        // 创建一个新的Bitmap对象,以便保存为BMP格式
        using (var bitmap = new Bitmap(originalImage))
        {
            // 设置保存选项以保持原始图像质量(无压缩)
            var encoderParams = new EncoderParameters(1);
            encoderParams.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Compression, 0);
            // 获取合适的BMP编码器
            var encoder = ImageCodecInfo.GetImageEncoders().First(info => info.FormatID == ImageFormat.Bmp.Guid);
            // 保存为BMP格式
            bitmap.Save(outputFile, encoder, encoderParams);
        }
    }
}

这段代码定义了一个名为 ConvertJpgToBmp 的方法,接受两个参数:inputJpgFilePath(要读取的JPG文件路径)和 outputBmpFilePath(要保存的BMP文件路径)。其主要步骤包括:

  1. 使用 Image.FromFile 方法读取指定路径的JPG文件,得到一个 Image 对象。
  2. 创建一个新的 Bitmap 对象,使用读取到的 Image 作为源。这样做的目的是确保我们能够以目标格式(BMP)保存图像,因为 Bitmap 类提供了更丰富的格式控制功能。
  3. 设置 EncoderParameters 以指定保存时使用无压缩(即保持原始图像质量),这对于BMP格式来说通常是默认行为,这里主要是为了演示如何设置编码参数。
  4. 通过 ImageCodecInfo.GetImageEncoders() 获取到与BMP格式对应的编码器信息。
  5. 最后,使用 Bitmap.Save 方法,传入输出文件路径、选择的编码器以及编码参数,将图像保存为BMP格式。

调用此方法,传入实际的JPG文件路径和期望的BMP文件保存路径,即可完成转换过程。

例如:

ConvertJpgToBmp(@"C:\input.jpg", @"C:\output.bmp");

 

二、Bitmap转JPG

要使用C#读取一个BMP文件并将其保存为JPG格式,同样可以利用System.Drawing命名空间中的类,代码如下:

using System.Drawing;
using System.Drawing.Imaging;

//BmpToJpg
public static void ConvertBmpToJpg(string inputFile, string outputFile, int quality = 80)
{
    // 读取BMP文件
    using (var originalImage = Image.FromFile(inputFile))
    {
        // 创建一个新的Bitmap对象,以便保存为JPG格式
        using (var bitmap = new Bitmap(originalImage))
        {
            // 设置JPEG编码器参数,包括压缩质量(范围0-100,数值越高,质量越好但文件越大)
            var encoderParams = new EncoderParameters(1);
            encoderParams.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);
            // 获取合适的JPEG编码器
            var encoder = ImageCodecInfo.GetImageEncoders().First(info => info.FormatID == ImageFormat.Jpeg.Guid);
            // 保存为JPG格式
            bitmap.Save(outputFile, encoder, encoderParams);
        }
    }
}

这段代码定义了一个名为 ConvertBmpToJpg 的方法,它接受三个参数:

  • inputBmpFilePath:要读取的BMP文件路径。
  • outputJpgFilePath:要保存的JPG文件路径。
  • quality(可选):JPG压缩质量,范围为0到100,数值越高代表图像质量越好但文件尺寸越大。默认值为80,这是一个常用的折衷值,既保证了较好的视觉效果,又能保持相对较小的文件体积。

方法执行的主要步骤如下:

  1. 使用 Image.FromFile 方法读取指定路径的BMP文件,得到一个 Image 对象。
  2. 创建一个新的 Bitmap 对象,使用读取到的 Image 作为源,以便后续以JPG格式保存。
  3. 设置 EncoderParameters,指定JPG的压缩质量。
  4. 通过 ImageCodecInfo.GetImageEncoders() 获取到与JPG格式对应的编码器信息。
  5. 调用 Bitmap.Save 方法,传入输出文件路径、选定的编码器以及编码参数,将图像保存为JPG格式。

要使用这个方法进行转换,只需提供相应的输入BMP文件路径和输出JPG文件路径,可选地调整压缩质量参数。

例如:

ConvertBmpToJpg(@"C:\input.bmp", @"C:\output.jpg", quality: 90);

这段代码适用于基于GDI+的Windows Forms或WPF应用程序。对于非GDI+环境或跨平台项目,如ASP.NET Core或.NET Core应用,可能需要使用其他图像处理库,如ImageSharp。

 

三、其他转换 

C# Bitmap转换为jpg、bmp、png、gif图片_c# bitmap转jpg-CSDN博客

C# 从指定路径读取图片源、Bitmap与ImageSource互转、Bitmap与BitmapImage互转、BitmapImage转为byte[]、图片压缩_c# imagesource bitmap-CSDN博客

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/574589.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

硬件玩物 | 性价比超高的NAS,威联通【TS-464-C2】快速上手初体验!

[ 知识是人生的灯塔,只有不断学习,才能照亮前行的道路。] 大家好,我是【WeiyiGeek/唯一极客】一个正在向全栈工程师(SecDevOps)前进的技术爱好者 作者微信:WeiyiGeeker 公众号/知识星球:全栈工程师修炼指南 主页博…

1、k8s问题pod从service中剔除

一、起因 redis原来由两服务器的集群变为三服务器的集群,通过statefulset扩展了两节点,并把redis-app-0和redis-app-3从集群中去除,但是由于service路由后端不变,导致程序连接后端仍然可能到redis-app-0和redis-app-3 二、处理 …

【Unity 实用工具篇】 | UIEffect 实现一系列UGUI特效,描边及阴影特效

前言 【Unity 实用工具篇】 | UIEffect 实现一系列UGUI特效,描边及阴影特效一、UGUI特效插件:UIEffect1.1 介绍 二、组件属性面板三、代码操作组件 总结 前言 在Unity中 UGUI 的使用几乎是必不可少的,虽然也有NGUI、FGUI等可以使用&#xff…

Spring Kafka——基于 Spring Kafka 实现动态管理 Kafka 连接和 topic 的监听

文章目录 使用 Spring Kafka 动态管理 Kafka 连接和主题监听1. 前言2. 简单的消费程序配置3. Spring Kafka 主要的相关类的说明4. KafkaListener 注解的加载执行流程解析5. 动态监听消费订阅的设计与实现 使用 Spring Kafka 动态管理 Kafka 连接和主题监听 文章内容较长&#x…

Error opening file a bytes-like object is required,not ‘NoneType‘

错误显示,打开的是一个无效路径的文件 查看json文件内容,索引的路径与json文件保存的路径不同 方法:使用python脚本统一修改json文件路径 import json import os import argparse import cv2 from tqdm import tqdm import numpy as np impo…

组合优于继承:什么情况下可以使用继承?

C设计模式专栏:http://t.csdnimg.cn/8Ulj3 目录 1.引言 2.为什么不推荐使用继承 3.相比继承,组合有哪些优势 4.如何决定是使用组合还是使用继承 1.引言 面向对象编程中有一条经典的设计原则:组合优于继承,也常被描述为多用组合&#xff0…

JavaScript原理篇——深入理解作用域、作用域链、闭包、this指向

执行上下文描述了代码执行时的环境,包括变量对象、作用域链和 this 值;而作用域则决定了变量和函数的可访问性范围,分为全局作用域和局部作用域。 变量对象用于存储变量和函数声明:是与执行上下文相关联的数据结构,用于…

USB设备的音频类UAC

一、UAC简介 UAC(USB Audio Class)是USB设备的音频类,它定义了USB音频设备与主机计算机通信的方式。UAC标准是USB规范的一部分,并受到各种操作系统(包括Windows、macOS和Linux)的支持。 UAC是基于libusb,实…

代码随想录算法训练营第五十一天| 309.最佳买卖股票时机含冷冻期,714.买卖股票的最佳时机含手续费,总结

题目与题解 参考资料:买卖股票总结 309.最佳买卖股票时机含冷冻期 题目链接:309.最佳买卖股票时机含冷冻期 代码随想录题解:309.最佳买卖股票时机含冷冻期 视频讲解:动态规划来决定最佳时机,这次有冷冻期!|…

【自然语言处理】InstructGPT、GPT-4 概述

InstructGPT官方论文地址:https://arxiv.org/pdf/2203.02155.pdf GPT-4 Technical Report:https://arxiv.org/pdf/2303.08774.pdf GPT-4:GPT-4 目录 1 InstructGPT 2 GPT-4 1 InstructGPT 在了解ChatGPT之前,我们先看看Instr…

k8s pod 无法启动一直ContainerCreating

情况如下,更新 pod 时,一直在ContainerCreating 查看详细信息如下 Failed to create pod sandbox: rpc error: code Unknown desc [failed to set up sandbox container “334d991a478b9640c66c67b46305122d7f0eefc98b2b4e671301f1981d9b9bc6” networ…

Jsoncpp搭建交叉编译环境(移植到arm)

1. 官网下载源码 github地址:GitHub - open-source-parsers/jsoncpp at update 2. 交叉编译环境 当前平台/开发平台-编译环境: [rootlocalroot ~]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) [rootlocalroot ~]# uname -a Lin…

Django框架之Django安装与使用

一、Django框架下载 首先我们需要先确定好自己电脑上的python解释器环境,否则会导致后面项目所需要的库安装不了以及项目无法运行的问题。 要下载Django并开始使用它,你可以按照以下步骤进行: 1、安装Python 首先,确保你的计算…

C/C++开发,opencv-ml库学习,支持向量机(SVM)应用

目录 一、OpenCV支持向量机(SVM)模块 1.1 openCV的机器学习库 1.2 SVM(支持向量机)模块 1.3 支持向量机(SVM)应用步骤 二、支持向量机(SVM)应用示例 2.1 训练及验证数据获取 2…

报错:OpenGL.error.NullFunctionError: Attempt to call an undefined function”

文件我已经上传 CSDN默认就是收费的 我修改不了 免费链接在文中 请寻找 OpenGL.error.NullFunctionError: Attempt to call an undefined function” 环境陈述: windows11 AMD-R9 python版本3.9.9 背景: 通过pip安装pip install PyOpenGL安装PyOpenGL模块后 运行出现的问题…

NLP Step by Step -- How to use pipeline

正如我们在摸鱼有一手:NLP step by step -- 了解Transformer中看到的那样,Transformers模型通常非常大。对于数以百万计到数千万计数十亿的参数,训练和部署这些模型是一项复杂的任务。此外,由于几乎每天都在发布新模型&#xff0c…

数据挖掘实验一

一、实验环境及背景 使用软件: Anaconda3 Jupyter Notebook 实验内容: 1.使用Tushare或者其他手段获取任意两支股票近三个月的交易数据。做出收盘价的变动图像。2.使用Pandas_datareader获取世界银行数据库中美国(USA)、瑞典&…

Windows电脑中护眼(夜间)模式的开启异常

我的电脑是联想小新16pro,Windows11版本。之前一直可以正常使用夜间模式,但是经过一次电脑的版本更新之后,我重启电脑发现我的夜间模式不能使用了。明明显示开启状态,但是却不能使用,电脑还是无法显示夜间模式。 询问…

基于Spring Boot的考研资讯平台设计与实现

基于Spring Boot的考研资讯平台设计与实现 开发语言:Java框架:springbootJDK版本:JDK1.8数据库工具:Navicat11开发软件:eclipse/myeclipse/idea 系统部分展示 系统功能界面图,在系统首页可以查看首页、考…

【Qt QML】TabBar的用法

Qt Quick中的TabBar提供了一个基于选项卡的导航模型。TabBar由TabButton控件填充,并且可以与任何提供currentIndex属性的布局或容器控件一起使用,例如StackLayout或SwipeView。 import QtQuick import QtQuick.Controls import QtQuick.LayoutsWindow …
最新文章