c# bitmap压缩导致png不透明的问题解决

news2024/12/28 4:45:04

新建.net 6控制台项目
安装System.Drawing.Common包
在这里插入图片描述
代码如下

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

namespace PngCompress02
{
    internal class Program
    {
        static void Main(string[] args)
        {
            CompressPngImage(@"E:\Desktop\6.png", @"E:\Desktop\6_60.png", 60);
            Console.WriteLine("完成");
        }

        public static void CompressPngImage(string sourcePath, string targetPath, long quality)
        {
            using (var image = Image.FromFile(sourcePath))
            {
                var encoderParameters = new EncoderParameters(1);
                encoderParameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);

                var imageCodecInfo = GetPngImageCodec();
                //var imageFormat = ImageFormat.Png;
                Bitmap bitmap = new Bitmap(image);
                bitmap.Save(targetPath, imageCodecInfo, encoderParameters);
            }
        }

        private static ImageCodecInfo GetPngImageCodec()
        {
            var codecs = ImageCodecInfo.GetImageEncoders();
            foreach (var codec in codecs)
            {
                if (codec.FormatID == ImageFormat.Png.Guid)
                {
                    return codec;
                }
            }
            throw new ArgumentException("No PNG image codec found.");
        }
    }
}

测试结果
在这里插入图片描述

既要压缩图片也要改变图片大小

实现思路:先改变图片大小后压缩处理

/// <summary>
/// 重新改变png图片的大小
/// </summary>
/// <param name="image"></param>
/// <param name="newWidth">改变成为的宽度大小</param>
/// <param name="newHeight">改变成为的高度大小</param>
/// <returns></returns>
public static byte[] ResizePngImage(Image image, int newWidth, int newHeight)
{
    // 确保图片格式为Png  
    //if (image.RawFormat.Guid != ImageFormat.Png.Guid)
    //{
    //    throw new InvalidOperationException("不支持的图片格式。请使用PNG格式。");
    //}
    MemoryStream memoryStream = new MemoryStream();
    // 创建一个新的Bitmap对象,并设置其分辨率为原始图像的分辨率  
    using (Bitmap newImage = new Bitmap(newWidth, newHeight))
    {
        newImage.SetResolution(image.HorizontalResolution, image.VerticalResolution);

        // 使用Graphics对象从原始图像绘制到新的Bitmap上  
        using (Graphics graphics = Graphics.FromImage(newImage))
        {
            // 设置高质量插值法以进行图像缩放  
            graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;

            // 在新图像上绘制原始图像  
            graphics.DrawImage(image, new Rectangle(Point.Empty, new Size(newWidth, newHeight)));
        }
        // 对于PNG图像,我们需要特别处理透明度。这里我们保存带有透明度的图像。  
        newImage.Save(memoryStream, ImageFormat.Png);
    }
    return memoryStream.GetBuffer();
}

//压缩图片,返回图片byte[]数组 宽度高度和质量
public byte[] compressPngImage(int sW,int sH int flag)
{
	var iSource = System.Drawing.Image.FromFile(sFile);
	var pngStream = ResizePngImage(iSource, sW, sH);
	var pngImage = Image.FromStream(new MemoryStream(pngStream));
	var encoder = ImageCodecInfo.GetImageEncoders().FirstOrDefault(c => c.FormatID == ImageFormat.Png.Guid);
	if (encoder != null)
	{
	    // Set the quality parameter for the PNG encoder  
	    var encoderParameters = new EncoderParameters(1);
	    encoderParameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, flag);
	    // Save the resized image using the PNG encoder with the specified quality level  
	    var thumbnailStream = new MemoryStream();
	    pngImage.Save(thumbnailStream, encoder, encoderParameters);
	    return thumbnailStream.GetBuffer();
	}
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL undo日志精讲

事务回滚的需求 我们说过事务需要保证原子性&#xff0c;也就是事务中的操作要么全部完成&#xff0c;要么什么也不做。但是偏偏有时候事务执行到一半会出现一些情况&#xff0c;比如&#xff1a; 情况一&#xff1a;事务执行过程中可能遇到各种错误&#xff0c;比如服务器本身…

基于ssm的简单学校课程管理系统的设计与实现(源码+调试)

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。今天给大家介绍一篇基于ssm的简单学校课程管…

智慧路灯杆如何实现雪天道路安全监测

随着北方区域连续发生暴雪、寒潮、大风等气象变化&#xff0c;北方多地产生暴雪和低温雨雪冰冻灾害风险&#xff0c;冬季雨雪天气深度影响人们出行生活&#xff0c;也持续增加道路交通风险。 智慧路灯杆是现代城市不可或缺的智能基础设施&#xff0c;凭借搭载智慧照明、环境监测…

读论文:Restormer: Efficient Transformer for High-Resolution Image Restoration

《Restormer: Efficient Transformer for High-Resolution Image Restoration》发表于2022年的CVPR&#xff0c;在 Transformer block 中进行了几个关键设计以提出一种新的高效的视觉 Transformer&#xff0c;称为 Restormer&#xff0c;再一次刷新了视觉 transformer 在高分辨…

山西电力市场日前价格预测【2023-12-16】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-12-16&#xff09;山西电力市场全天平均日前电价为259.00元/MWh。其中&#xff0c;最高日前电价为333.74元/MWh&#xff0c;预计出现在18:00。最低日前电价为0.00元/MWh&#xff0c;预计出…

Intellij IDEA 运行maven报错误“CreateProcess error=2, 系统找不到指定的文件“的完美解决方案

一、问题背景 博主正常使用着Intellij IDEA&#xff0c;不知道为什么突然Intellij IDEA报错&#xff0c;错误提示如下&#xff1a; Error:Cannot run program "C:\Program Files\Java\jdk1.8.0_351" 观察Intellij IDEA报错的原因&#xff0c;我们可以知道&#xff1…

​FL Studio2024最新版本好不好用?有哪些新功能

FL Studio2024版是一款在国内非常受欢迎的多功能音频处理软件&#xff0c;我们可以通过这款软件来对多种不同格式的音频文件来进行编辑处理。而且FL Studio 2024版还为用户们准备了超多的音乐乐器伴奏&#xff0c;我们可以直接一键调取自己需要的音调。 FL Studio 2024版不仅拥…

一分钟解决:vscode卡在“设置SSH主机:VS Code-正在本地下载 VS Code 服务器”

问题&#xff1a;vscode之前可正常使用&#xff0c;更新之后&#xff0c;连接服务器卡住了。 解决&#xff1a;从CMD或者你的终端连接服务器&#xff0c;进入vscode-server目录下&#xff0c;删除一些文件夹就行&#xff0c;然后使用vscode重新链接&#xff0c;它会自动下载新…

机器学习:自督导式学习模型

outline 自督导式模型有跨语言的能力 中文&#xff1a;DRCD的数据集英文&#xff1a;SQuAD的数据集 在104种语言上进行学习&#xff0c;并在英文上进行微调&#xff0c;结果在中文上效果也比较好。 XTREME Benchmark 只用英文进行微调&#xff0c;在其他剩下的语言中进行测试。…

【计算机视觉】SIFT

在边缘提取的时候&#xff0c;用高斯一阶导对信号进行卷积&#xff0c;响应值最大的就是边界如果用高斯二阶导对信号进行卷积&#xff0c;0点就是边界点&#xff08;二阶导等于0的点&#xff0c;对应一阶导的极值点&#xff09; 如果用高斯二阶导在不同的信号上进行卷积&#x…

基于主动安全的AIGC数据安全建设

面对AIGC带来的数据安全新问题&#xff0c;是不是就应该一刀切禁止AIGC的研究利用呢&#xff1f;答案是否定的。要发展AIGC&#xff0c;也要主动积极地对AIGC的数据安全进行建设。让AIGC更加安全、可靠的为用户服务。为达到此目的&#xff0c;应该从三个方面来开展AIGC的数据安…

【GPU】安装nvidia驱动

安装NVIDIA驱动通常有几种方法&#xff0c;包括使用发行版自带的软件仓库、使用NVIDIA官方网站上的.run文件、或使用专有的PPA&#xff08;个人软件包存档&#xff09;等。以下是基于不同情况的一般步骤&#xff1a; 一、通过发行版仓库安装&#xff08;以Ubuntu为例&#xff…

【深度强化学习】策略梯度方法:REINFORCE、Actor-Critic

参考 Reinforcement Learning, Second Edition An Introduction By Richard S. Sutton and Andrew G. Barto非策略梯度方法的问题 之前的算法&#xff0c;无论是 MC&#xff0c;TD&#xff0c;SARSA&#xff0c;Q-learning&#xff0c; 还是 DQN、Double DQN、Dueling DQN…

day02-报表技术POI

1、基于模板导出列表数据 1.1、需求 按照以下样式导出excel 1.2、思路 首先准备一个excel模板&#xff0c;这个模板把复杂的样式和固定的内容先准备好并且放入到项目中&#xff0c;然后读取到模板后向里面放入数据。 1.3、实现 第一步&#xff1a;准备一个excel作为导出的…

ShuffleNet V1+V2(pytorch)

V1 V1根本思想&#xff1a; 1.GConv替换resnet的普通1*1Conv 2.GConv后加channel shuffle模块 对GConv的不同组进行重新组合。channel_shuffle a是resnet模块&#xff0c;b&#xff0c;c是ShuffleNetV1的block&#xff0c;在V1版中&#xff0c;两模块branch2的第一个1*1卷积…

i春秋云镜之Tsclient

首先拿到目标:39.99.137.155 首先通过Fscan扫描目标: 可以看到扫描出来了一个SqlServer的弱口令。 账号是sa&#xff0c;密码是1qaz!QAZ。 这里就不使用navicat进行连接了&#xff0c;这里使用impacket-mssqlclient进行连接。 impacket-mssqlclient sa:1qaz!QAZ39.99.137.…

Electron框架:构建跨平台桌面应用的终极解决方案

文章目录 一、Electron框架简介二、Electron框架的优势1. 开发效率高2. 跨平台性能好3. 易于维护4. 强大的原生能力 三、如何使用Electron框架快速开发跨平台桌面应用1. 安装Electron2. 创建项目文件夹3. 编写主进程代码4. 编写界面代码5. 运行应用 《Electron入门与实战》编辑…

Chromadb词向量数据库总结

简介 Chroma 词向量数据库是一个用于自然语言处理&#xff08;NLP&#xff09;和机器学习的工具&#xff0c;它主要用于词嵌入&#xff08;word embeddings&#xff09;。词向量是将单词转换为向量表示的技术&#xff0c;可以捕获单词之间的语义和语法关系&#xff0c;使得计算…

linux日志管理_日志轮转logrotate

10.2 日志轮转logrotate 10.2.1 简介 日志&#xff1a;记录了程序运行时各种信息。通过日志可以分析用户行为&#xff0c;记录运行轨迹&#xff0c;查找程序问题。 ​ 但由于磁盘的空间是有限的&#xff0c;日志轮转就像飞机里的黑匣子&#xff0c;记录的信息再重要也只能记录…

漏刻有时百度地图API实战开发(12)(切片工具的使用、添加自定义图层TileLayer)

TileLayer向地图中添加自定义图层 var tileLayer new BMap.TileLayer();tileLayer.getTilesUrl function (tileCoord, zoom) {var x tileCoord.x;var y tileCoord.y;return images/tiles/ zoom /tile- x _ y .png;}var lockMap new BMap.MapType(lock_map, tileLaye…