关于.netcore即时生成缩略图踩的坑
最近在开发一套系统,很多地方用到了缩略图,然而不同的地方用到的尺寸又不一样,上传的时候生成缩略图就没有意义了,因为你不知道会使用到哪些尺寸,于是想到即时生成的办法,前端判断图片是否存在,如果不存在则调用接口生成缩略图,同时接口返回缩略图的数据流。
本来功能都开发完成,可以达到目的,但是在会员头像使用Png生成缩略图是遇到了一个问题,就是生成的缩略图不是透明的,变成黑底色了。更奇怪的问题是并不是所有png图片都这样,同一张图片在不同的地方也有不一样的效果。
没有修改之前的代码如下:
/// <summary>
/// 访问图片,接口调用方式 https://您的域名/WebApi/common/200/image%2F2022-06%2Fbb372369c3ad4d458ad2aee6c00ca4bd.png
///其中200是图片宽度,后面是图片的相对路径
/// </summary>
/// <param name="width">所访问图片的宽度,高度自动缩放,大于原图尺寸或者小于等于0返回原图</param>
/// <param name="name">所要访问图片的名称或者相对地址</param>
/// <returns>图片</returns>
[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 <= 0)
{
using(var sw = objectStorage.GetObject(name))
{
var bytes = new byte[sw.Length];
sw.Read(bytes, 0, bytes.Length);
sw.Close();
return new FileContentResult(bytes, contentTypeStr);
}
}
else
{
thumname = name.Replace(ext, "_" + width + ext);
isThum = true;
} if(name != errorImage && !objectStorage.ExistObject(name))
{
name = errorImage;
}
if(isThum && !objectStorage.ExistObject(thumname))
{
saveThum = true;
}
//缩小图片
using(var imgBmp = new Bitmap(Image.FromStream(objectStorage.GetObject(name))))
{
//找到新尺寸
var oWidth = imgBmp.Width;
var oHeight = imgBmp.Height;
var height = oHeight;
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);
}
}
代码如上,表面上看起来看不出来问题,后来我认真检查了一下代码,发现newImg.Save(ms, ImageFormat.Bmp);这句代码有点问题,为什么是固定的bmp格式,于是我将这句代码改成如下代码:
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;
}
问题解决,原来文件流里面也是要指定文件保存的格式的,不然就会出现想不到的问题。
关于.netcore即时生成缩略图踩的坑的更多相关文章
- 小程序canvas生成二维码图片踩的坑
1:生成临时图片,保证画布被加载以及渲染(即本身不可以 hidden 或是 上级元素不可以 hidden 或是 wx:if 隐藏等) == > 建议:因为 canvas 的组件层级(z-inde ...
- netcore 自动生成Dockerfile的坑
简介 之前采用shell脚本+dockerfile的方式构建项目,后来发现有Docker在17.05版本之后有多阶段构建方式,该文主要记录了netcore采用dockerfile构建遇到的坑. 原 ...
- webuploader插件,我踩得坑
我在目前的公司做的项目要么是原生写法去做项目,要么就是vue+webpack做项目,但是vue这部分只是用了模板template,vue其他的都没用. 有一个项目需要做上传图片的功能,老大扔给我一个插 ...
- Asp.Net Core中使用Swagger,你不得不踩的坑
很久不来写blog了,换了新工作后很累,很忙.每天常态化加班到21点,偶尔还会到凌晨,加班很累,但这段时间,也确实学到了不少知识,今天这篇文章和大家分享一下:Asp.Net Core中使用Swagge ...
- fastdfs+nginx+image_filter安装与生成缩略图
fastdfs简介 类似google FS的一个轻量级分布式文件系统,纯C实现,支持linux.FreeBSD等UNIX系统: 只能通过API访问,不支持POXIS: 文件不分块存储,上传的文件和OS ...
- java基础不牢固容易踩的坑
java基础不牢固容易踩的坑 经过一年java后端代码以及对jdk源码阅读之后的总结,对java中一些基础中的容易忽略的东西写下来,给偏爱技术热爱开源的Coder们分享一下,避免在写代码中误入雷区. ...
- 在kotlin用jni调用c++的dll中踩的坑
在kotlin用jni调用c++的dll中踩的坑 can't find dependents libraries 不是个有效的32位程序(或者是?????32??????) 常规检查 java 指针 ...
- C# webform上传图片并生成缩略图
其实里面写的很乱,包括修改文件名什么的都没有仔细去写,主要是想记录下缩略图生成的几种方式 ,大家明白就好! void UpImgs() { if (FileUpload1.HasFile) { str ...
- 从零开始学 Java - Spring 支持 CORS 请求踩的坑
谁没掉进过几个大坑 记得好久之前,总能时不时在某个地方看到一些标语,往往都是上面一个伟人的头像,然后不管是不是他说的话,下面总是有看起来很政治正确且没卵用的屁话,我活到目前为止,最令我笑的肚子痛得是下 ...
- phpcms v9图片生成缩略图变成黑色解决方法
今天客户反映,上传的图片生成缩略图有的图片变成黑色,出现问题就百度了一下,有不少网友也遇到这样的问题,但是官方论坛也没有给出解决办法,那还得靠自己解决了,于是就研究phpcms v9 图片压缩代码.打 ...
随机推荐
- HUAWEI USG6505E 如何使用光电互斥口
1.display ip interface brief 2.display int g0/0/4 查看端口 是否为光电互斥口,并确定端口当前状态 Copper 电口 Fiber 光口 3.inte ...
- 如何用JavaScript纯前端来实现下载脚本
1.javascript脚本 function downloadFile(data, fileName, type="text/plain") { // 创建不可见的元素 cons ...
- MySQL高可用之ProxySQL + MGR 实现读写分离实战
部署MGR 1.MGR 前置介绍 阿里云RDS集群方案用的就是MGR模式! 1.1.什么是 MGR MGR(MySQL Group Replication)是MySQL 5.7.17版本诞生的,是My ...
- AI模型的回调能力的理解和实现
前言 BigTall最近把RAG和Agent的原理想通了,对于"一切都是提示词"的理解又更多了一些.本文把我的理解大致整理了一下,给出BigTall自己的一个实验.希望能够对大家有 ...
- WPF 基于Transform实现画布超出边界触发计算
有些场景需要对画布边界做界限控制,此时需要计算画布的四个方向的界限和极值 先看效果图: 画布在通过RenderTransform 做变换,由于在变换的过程中,实际的宽高没有改变,需要通过Transfo ...
- Mysql基线核查
查看版本信息 select @@version 查看默认创建的测试库和测试用户 show databases like "test%"; select * from mysql.u ...
- IntelliJ IDEA FIX协议报文解析插件
Fix协议报文手动对照对手方的API查看十分繁琐,尤其是在开发的过程中. 于是我写了一个Fix协议报文解析插件,在idea插件应用市场搜索"Fix Protocol Parser" ...
- ChatMoney是你创业自由副业的plan B!
本文由 ChatMoney团队出品 人生永远要有Plan B,在当下的市场经济环境中,工作收入和日常支出完全不能平衡,导致生活质量越来越不理想.如果觉得实在撑不下去,也许可以换个思路.我在工作之余,也 ...
- Visual Studio 2022 中的 EF Core 反向工程和模型可视化扩展插件
前言 在 EF 6 及其之前的版本数据库优先模式(Database First)是可以在 Visual Studio 中通过可视化界面来操作完成的,但是到了 EF Core 之后就不再支持了(因为模型 ...
- New ABAP Debugger Session does not close after Exit
最近在PRD调试程序的时候,每次都是调试结束,但是调试的会话不会关闭,每次都要退出程序或者右键结束进程才行... 之前一直没想着找这个问题,今天单独看了一下...可能这就是公用账号的悲哀吧... 两个 ...