C# - 如何更改 PNG 质量或颜色深度

2024-03-25

我应该编写一个程序,从用户那里获取一些 PNG 图像,进行一些简单的编辑(例如旋转)并将它们保存在 JAR 文件中,以便它可以使用图像作为资源。问题是,当我打开一个 80kb 图像,然后用 C# 保存它时,我会得到一个具有相同质量但占用 130kb 空间的图像。因为它必须放入 J2ME jar 文件中,所以我确实需要较小的大小,至少是原始大小。我尝试了下面的代码,但后来发现它只适用于 Jpeg 图像。

ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();
                int j = 0;
                for (j = 0; j < codecs.Length; j++)
                {
                    if (codecs[j].MimeType == "image/png") break;
                }
                EncoderParameter ratio = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 10L);
                EncoderParameters CodecParams = new EncoderParameters(1);
                CodecParams.Param[0] = ratio;

                Image im;
                im = pictureBox1.Image;
                im.Save(address , codecs[j], CodecParams);

这是图像加载到图片框的位置:

private void pictureBox1_DoubleClick(object sender, EventArgs e)
        {
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                string address = openFileDialog1.FileName;
                address.Replace("\\", "\\\\");
                Image im = Image.FromFile(address);
                pictureBox1.Image = im;
            }
        }

这就是它被保存回来的地方,没有任何编辑:

private void generateToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)
            {

                ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();
                int j = 0;
                for (j = 0; j < codecs.Length; j++)
                {
                    if (codecs[j].MimeType == "image/png") break;
                }
                EncoderParameter ratio = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 10L);
                EncoderParameters CodecParams = new EncoderParameters(1);
                CodecParams.Param[0] = ratio;

                string address = folderBrowserDialog1.SelectedPath;
                address = address + "\\";
                address.Replace("\\", "\\\\");

                Image im;
                im = pictureBox1.Image;               
                im.Save(address + imageFileNames[1], codecs[j], CodecParams);

注意:imageFileNames[] 只是一个字符串数组,其中包含必须保存图像的一些文件名。

任何想法将不胜感激并提前致谢。


很抱歉提出一个老问题,但我今天正在解决同样的问题,并在 MSDN 上找到了此页面:“列出所有编码器的参数和值” http://msdn.microsoft.com/en-us/library/ms533846.aspx。我希望在那里参考它可能会有用。

本文包含一个输出的示例程序EncoderParameter库存 GDI+ 图像编码器支持,而 PNG 编码器不支持任何参数。

我不确定人们是否可以认为这是理所当然的,或者在未来的某个版本中gdiplus.dllPNG 编码器可能会增加更多支持,因此应该在运行时检查编码器的功能。

无论如何,对源图像应用一些显式变换似乎是更有效的方法;不过我还没有探索过。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# - 如何更改 PNG 质量或颜色深度 的相关文章

  • 如何验证文件名称在 Windows 中是否有效?

    是否有一个 Windows API 函数可以将字符串值传递给该函数 该函数将返回一个指示文件名是否有效的值 我需要验证文件名是否有效 并且我正在寻找一种简单的方法来完成此操作 而无需重新发明轮子 我正在直接使用 C 但针对的是 Win32
  • 访问私人成员[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 通过将类的私有成员转换为 void 指针 然后转换为结构来访问类的私有成员是否合适 我认为我无权修改包含我需要访问的数据成员的类 如果不道德 我
  • C - 找到极限之间的所有友好数字

    首先是定义 一对友好的数字由两个不同的整数组成 其中 第一个整数的除数之和等于第二个整数 并且 第二个整数的除数之和等于第一个整数 完美数是等于其自身约数之和的数 我想做的是制作一个程序 询问用户一个下限和一个上限 然后向他 她提供这两个限
  • 获取没有非标准端口的原始 url (C#)

    第一个问题 环境 MVC C AppHarbor Problem 我正在调用 openid 提供商 并根据域生成绝对回调 url 在我的本地机器上 如果我点击的话 效果很好http localhost 12345 login Request
  • Json.NET - 反序列化接口属性引发错误“类型是接口或抽象类,无法实例化”

    我有一个类 其属性是接口 public class Foo public int Number get set public ISomething Thing get set 尝试反序列化Foo使用 Json NET 的类给我一条错误消息
  • 在 ASP.NET Core 3.1 中使用包含“System.Web.HttpContext”的旧项目

    我们有一些用 Net Framework编写的遗留项目 应该由由ASP NET Core3 1编写的API项目使用 问题是这些遗留项目正在使用 System Web HttpContext 您知道它不再存在于 net core 中 现在我们
  • Github Action 在运行可执行文件时卡住

    我正在尝试设置运行google tests on a C repository using Github Actions正在运行的Windows Latest 构建过程完成 但是当运行测试时 它被卡住并且不执行从生成的可执行文件Visual
  • Qt表格小部件,删除行的按钮

    我有一个 QTableWidget 对于所有行 我将一列的 setCellWidget 设置为按钮 我想将此按钮连接到删除该行的函数 我尝试了这段代码 它不起作用 因为如果我只是单击按钮 我不会将当前行设置为按钮的行 ui gt table
  • clang 实例化后静态成员初始化

    这样的代码可以用 GCC 编译 但 clang 3 5 失败 include
  • 从库中捕获主线程 SynchronizationContext 或 Dispatcher

    我有一个 C 库 希望能够将工作发送 发布到 主 ui 线程 如果存在 该库可供以下人员使用 一个winforms应用程序 本机应用程序 带 UI 控制台应用程序 没有 UI 在库中 我想在初始化期间捕获一些东西 Synchronizati
  • 如何在 VBA 中声明接受 XlfOper (LPXLOPER) 类型参数的函数?

    我在之前的回答里发现了问题 https stackoverflow com q 19325258 159684一种无需注册即可调用 C xll 中定义的函数的方法 我之前使用 XLW 提供的注册基础结构 并且使用 XlfOper 类型在 V
  • 将 unsigned char * (uint8_t *) 转换为 const char *

    我有一个带有 uint8 t 参数的函数 uint8 t ihex decode uint8 t in size t len uint8 t out uint8 t i hn ln for i 0 i lt len i 2 hn in i
  • 实体框架 4 DB 优先依赖注入?

    我更喜欢创建自己的数据库 设置索引 唯一约束等 使用 edmx 实体框架设计器 从数据库生成域模型是轻而易举的事 现在我有兴趣使用依赖注入来设置一些存储库 我查看了 StackOverflow 上的一些文章和帖子 似乎重点关注代码优先方法
  • 将 xml 反序列化为类,list<> 出现问题

    我有以下 XML
  • 插入记录后如何从SQL Server获取Identity值

    我在数据库中添加一条记录identity价值 我想在插入后获取身份值 我不想通过存储过程来做到这一点 这是我的代码 SQLString INSERT INTO myTable SQLString Cal1 Cal2 Cal3 Cal4 SQ
  • 控制到达非 void 函数末尾 -wreturn-type

    这是查找四个数字中的最大值的代码 include
  • 将文本叠加在图像背景上并转换为 PDF

    使用 NET 我想以编程方式创建一个 PDF 它仅包含一个背景图像 其上有两个具有不同字体和位置的标签 我已阅读过有关现有 PDF 库的信息 但不知道 如果适用 哪一个对于如此简单的任务来说最简单 有人愿意指导我吗 P D 我不想使用生成的
  • 如何使用 std::string 将所有出现的一个字符替换为两个字符?

    有没有一种简单的方法来替换所有出现的 in a std string with 转义 a 中的所有斜杠std string 完成此操作的最简单方法可能是boost字符串算法库 http www boost org doc libs 1 46
  • C 中的异或运算符

    在进行按位操作时 我在确定何时使用 XOR 运算符时遇到一些困难 按位与和或非常简单 当您想要屏蔽位时 请使用按位 AND 常见用例是 IP 寻址和子网掩码 当您想要打开位时 请使用包含或 然而 XOR 总是让我明白 我觉得如果在面试中被问
  • 恢复上传文件控制

    我确实阅读了以下帖子 C 暂停 恢复上传 https stackoverflow com questions 1048330 pause resume upload in c 使用 HTTP 恢复上传 https stackoverflow

随机推荐

  • Node.js POST 导致 [错误:套接字挂起] 代码:'ECONNRESET'

    我创建了一个示例来将数据发布到休息服务 我发现当我有非 ASCII 或非拉丁字符时 请参阅 data firstName 我使用 TEST REST js 的发布请求将抛出 错误 错误 套接字挂起 代码 ECONNRESET TEST RE
  • 如何用省略号删除右侧的多余空间

    我想用省略号类删除右侧的额外空间 ellipsis white space nowrap overflow hidden text overflow ellipsis max width 90px div float left clear
  • 如何在 Python 中检查空 gzip 文件

    我不想使用操作系统命令 因为这使得它依赖于操作系统 这可以在tarfile tarfile is tarfile filename 检查文件是否为 tar 文件 我在中找不到任何相关命令gzip module EDIT 为什么我需要这个 我
  • 如何使Spring缓存中的缓存名称可配置?

    我们使用 Spring 缓存框架进行缓存 并且希望能够支持多个缓存命名空间 例如 book 或 isbn 并且缓存命名空间是可配置的 而不是硬编码在类中 例如具有 Cacheable book isbn public Book findBo
  • JavaScript:内联函数与预定义函数

    任何人都可以向我提出一些关于使用的论据吗内联函数反对通过预定义函数给一些处理程序的名字 IE 哪个更好 function setTimeout function some code here 5 versus function functi
  • Android 2.2异常处理,catch参数null

    我想知道是否有人遇到奇怪的行为 我有 try catch 块 其中 catch 语句分配一个异常变量以使我能够正确处理异常 我得到的是 catch Exception ex 语句中的 ex null 请问我做错了什么 public clas
  • 如何读取用逗号分割的 CSV 文件,除非它是字段的一部分[重复]

    这个问题在这里已经有答案了 我有以下 C 代码 它读取 CSV 文件 目标是将其保存到 SQL 表中 StreamReader sr new StreamReader tbCSVFileLocation Text ToString stri
  • 在 google Drive api 的根目录中创建文件夹并将文件上传到该文件夹

    我想使用 CURL 在 google 驱动器根目录中创建文件夹 文件已上传到驱动器 但我需要创建一个文件夹并将文件上传到该文件夹 根据 hanshenrik 代码 创建文件夹正在工作 移动文件不起作用 我更新的代码 REDIRECT URI
  • 将列与 t-sql 中的值列表进行比较

    我正在页面上显示记录 并且我需要一种方法让用户选择要在另一个页面上显示的记录的子集 这些记录不存储在任何地方 而是动态生成的 在 sql 中说明 uniqueid 位于此 id 列表中而不是表等中的位置的最佳方法是什么 我知道我可以使用一堆
  • 模板化类专门化,其中模板参数是模板

    我想知道类似的事情是否可能 基本上 我有一个模板类 它偶尔会采用模板类的对象 我想将它 或只是一个成员函数 专门用于特定的模板类 但该类的 通用 形式 template
  • 如何在 C# 中关闭*多显示*?

    关于 如何在c 中关闭显示器 的文章有很多 但都是关闭所有显示器 有没有可能的方法来关闭特定的监视器 一些研究引导我来到这里 http www codeguru com forum showthread php p 1011720 post
  • 专有的 Haskell 库

    我对 Haskell 有点陌生 已经在业余项目中使用它几个月了 我想编写一个 C 库的 Haskell 接口 所有代码都是专有的 而不是开源的 所以我的问题是 如果我最终将其分发给客户并且不想提供源代码 而是提供诸如共享库之类的东西怎么办
  • 如何在未迁移到Androidx的项目中使用Androidx库

    我目前的项目还是比较稳定的 目前我不想迁移到 Androidx 但我需要用这个com pierfrancescosoffritti androidyoutubeplayer core 10 0 3我的项目中的图书馆 已迁移至 Android
  • 使 IE 中的内容不可选择

    这是我用 JS 写的图表 http jsfiddle net 49FVb http jsfiddle net 49FVb The css moz user select none khtml user select none 在 Chrom
  • Cassandra 3.9 和 CQL 规范版本

    只是好奇 Cassandra 3 9 支持哪些版本的 cql 我知道Cassandra 3 9支持cql 3 4 2 但是3 4 3是否也支持 以及如何升级 配置 Cassandra 3 9 以使用 cql 3 4 3 我在网上搜索了一下
  • 使用 C++ 连接到 MySQL 服务器

    我正在尝试使用 C 和 Visual C 2008 Express Edition 上的 MySQL ODBC 5 1 驱动程序连接到 MySQL 服务器 我按照 MSDN 中的这些说明进行操作 SQL连接 http msdn micros
  • 在 pandas 中指定 read_sql 的数据类型

    我想指定执行 pandas read sql 时返回的数据类型 我特别感兴趣的是节省内存并将浮点值返回为 np float32 而不是 np float64 我知道我可以随后使用 astype np float32 进行转换 但这并不能解决
  • 编译器无法识别我的 C++ 类 - 循环依赖

    有这个基类 Core hpp ifndef C3 CORE HPP define C3 CORE HPP include
  • Ruby:如何对字符串进行排序,同时保留一些字符?

    我是 Ruby 的新手 我想对字符串进行排序 但保留非字母数字字符 例如 hello sally seen 10 dec 2016 gt ehllo allsy eens 01 cde 0126 我尝试过这样做 word scan w co
  • C# - 如何更改 PNG 质量或颜色深度

    我应该编写一个程序 从用户那里获取一些 PNG 图像 进行一些简单的编辑 例如旋转 并将它们保存在 JAR 文件中 以便它可以使用图像作为资源 问题是 当我打开一个 80kb 图像 然后用 C 保存它时 我会得到一个具有相同质量但占用 13