关于.netcore即时生成缩略图踩的坑

最近在开发一套系统,很多地方用到了缩略图,然而不同的地方用到的尺寸又不一样,上传的时候生成缩略图就没有意义了,因为你不知道会使用到哪些尺寸,于是想到即时生成的办法,前端判断图片是否存在,如果不存在则调用接口生成缩略图,同时接口返回缩略图的数据流。

本来功能都开发完成,可以达到目的,但是在会员头像使用Png生成缩略图是遇到了一个问题,就是生成的缩略图不是透明的,变成黑底色了。更奇怪的问题是并不是所有png图片都这样,同一张图片在不同的地方也有不一样的效果。

没有修改之前的代码如下:

csharp;gutter:true; /// /// 访问图片,接口调用方式 https://您的域名/WebApi/common/200/image%2F2022-06%2Fbb372369c3ad4d458ad2aee6c00ca4bd.png      ///其中200是图片宽度,后面是图片的相对路径 /// /// 所访问图片的宽度,高度自动缩放,大于原图尺寸或者小于等于0返回原图 /// 所要访问图片的名称或者相对地址 /// 图片 [HttpGet] [Route("{width}/{name}")] public IActionResult GetImage(int width, string name) { var errorImage = "/static/common/images/404.png";//没有找到图片 if(name.IsEmptyString()) { name = errorImage; } else { name = HttpUtility.UrlDecode(name, Encoding.GetEncoding("utf-8")); name = name.Replace("/", "\"); if(name.StartsWith("\")) { name = name.Substring(1); } } var contentTypeStr = "image/jpeg"; var ext = Path.GetExtension(name); //未知的图片类型 if(!FileHelper.IsImageExt(ext)) { name = errorImage; } else { contentTypeStr = FileHelper.GetContentType(ext); } bool isThum = false;//是否是缩略图 var thumname = name;//缩略图路径 bool saveThum = false; //原图 if(width oWidth) { width = oWidth; } else { height = width * oHeight / oWidth; } var newImg = new Bitmap(imgBmp, width, height); newImg.SetResolution(72, 72); var ms = new MemoryStream(); newImg.Save(ms, ImageFormat.Bmp); if(saveThum) {            //这里是调用的类似OSS保存图片的方法 objectStorage.PutObject(thumname, ms); ms.Position = 0; } var bytes = ms.GetBuffer(); ms.Close(); return new FileContentResult(bytes, contentTypeStr); } }</p> <pre><code> 代码如上,表面上看起来看不出来问题,后来我认真检查了一下代码,发现newImg.Save(ms, ImageFormat.Bmp);这句代码有点问题,为什么是固定的bmp格式,于是我将这句代码改成如下代码: ;gutter:true;
switch(ext.ToLower())
{
case ".jpg":
case ".jpeg":
case ".jpe":
case ".jfif":
newImg.Save(ms, ImageFormat.Jpeg);
break;
case ".png":
newImg.Save(ms, ImageFormat.Png);
break;
case ".gif":
newImg.Save(ms, ImageFormat.Gif);
break;
case ".tif":
case ".tiff":
newImg.Save(ms, ImageFormat.Tiff);
break;
case ".bmp":
case ".wbmp":
newImg.Save(ms, ImageFormat.Bmp);
break;
default:
newImg.Save(ms, ImageFormat.Jpeg);
break;
}

问题解决,原来文件流里面也是要指定文件保存的格式的,不然就会出现想不到的问题。

Original: https://www.cnblogs.com/ithome8/p/16371806.html
Author: IT之家
Title: 关于.netcore即时生成缩略图踩的坑

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/591822/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 如何画出别人一看就懂的架构图?

    技术传播的价值,不仅仅体现在通过商业化产品和开源项目来缩短我们构建应用的路径,加速业务的上线速率,也体现在优秀工程师在工作效率提升、产品性能优化和用户体验改善等经验方面的分享,以提…

    数据库 2023年6月14日
    086
  • Python初识

    【参考资料】 零基础入门学习python(小甲鱼) 流畅的Python Python数据类型 Number数字类型 整数类型整数之间的进制转换  二进制     计算机常用    …

    数据库 2023年6月11日
    082
  • 【JDBC】笔记(5)— 悲观锁和乐观锁的概念;演示行级锁机制

    1.悲观锁和乐观锁的概念: 2.演示行级锁机制: 演示行级锁机制 此程序先开启事务,并使用行级锁锁住”loginName = abc”的那条记录 impor…

    数据库 2023年5月24日
    073
  • MySQL执行一条查询语句的过程

    查询缓存 在解析一个查询语句之前,如果查询缓存时打开的,那么 MySQL 会优先检查这个查询是否命中查询缓存中的数据。这个检查时通过一个对大小写敏感的哈希查找实现的。查询和缓存中的…

    数据库 2023年5月24日
    0103
  • ASP.NET MVC通用权限管理系统源代码开源发布(AngelRM_MVC)v2.1

    一、Angel工作室简单通用权限系统简介 AngelRM(Asp.net MVC)是基于asp.net(C#)MVC打造后端原生态代码+前端bootstrap+ztree+loda…

    数据库 2023年6月14日
    087
  • 0811JDBC随笔

    1.JDBC体系系统 一组规范:接口 JDBC接口(API)包括两个层次: 面向应用的API:Java API,抽象接口,供应用开发人员使用(连接数据库,执行SQL语句,获得结果)…

    数据库 2023年6月14日
    086
  • 【StoneDB】产品FAQ

    StoneDB与MySQL的兼容性如何?StoneDB高度兼容MySQL 5.6、5.7协议和MySQL生态等重要特性,支持MySQL常用的功能及语法。由于StoneDB本身的一些…

    数据库 2023年5月24日
    081
  • 解决pycharm问题:module ‘pip’ has no attribute ‘main’

    Pycharm安装package出现如下报错: 找到安装目录下 helpers/packaging_tool.py文件,找到如下代码: 修改如下: Original: https:…

    数据库 2023年6月6日
    0275
  • SQL99相较于SQL92在多表查询时的新语法

    1.自然连接 NATURAL JOIN SQL99中新增的自然连接相当于SQL92中的等值连接。它可以自动的查询两个表中 所有的相同字段,然后进行等值连接。 在SQL92中: SE…

    数据库 2023年6月16日
    084
  • iperf3的使用

    工具/原料 windows系统,iperf 32位和64位; 客户端和服务端的bat文件 方法/步骤 进入文件夹下面,运行”服务端iperf.bat”文件 …

    数据库 2023年6月9日
    075
  • Servlet中跨域问题详解

    一、什么是跨域 跨域,是指浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对JavaScript实施的安全限制。 浏览器从一个域名的网页去请求另一个域名的资源时…

    数据库 2023年6月14日
    096
  • Mysql终端Terminal操作

    datebase管理 1.创建数据库-create 语法:create database 数据库名 character set 编码 注意:默认会存在四个数据库,其数据库中存储的是…

    数据库 2023年6月14日
    065
  • python threading args参数报错must be an iterable, not int,解决方法

    错误代码: thread.append(threading.Thread(target=as_same_time, args=(0))) 分析: 因为as_same_time方法只…

    数据库 2023年6月11日
    078
  • 开源、强大的Linux服务器集群管理工具,比宝塔好用!

    在这之前肯定很多人都接触过Linux管理面板:宝塔,宝塔的确非常方便而且好用,安装也简单,复制粘贴几句命令即可安装完成,且提供免费版。今天呢,民工哥向大家介绍另一个Linux的服务…

    数据库 2023年6月9日
    0163
  • 数据库性能优化八大方案,你知道几个

    前言 毫不夸张的说咱们后端工程师,无论在哪家公司,呆在哪个团队,做哪个系统,遇到的第一个让人头疼的问题绝对是数据库性能问题。 如果我们有一套成熟的方法论,能让大家快速、准确的去选择…

    数据库 2023年6月14日
    075
  • Ajax请求下载文件的解决方案

    写这个博客之前我并不清楚 ajax请求是下载不了文件的 😅 这段时间在写一个自己的项目,用到了ajax下载文件,请求到了controller层并返回文件下载成功 但是浏览器就是没有…

    数据库 2023年6月9日
    0246
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球