文件上传,服务端压缩文件方法,重点是png与gif图片的压缩,保证了透明度与动画

时间:2023-01-10 17:33:14
 /// <summary>
/// 上传文件帮助类
/// </summary>
public class ImageUploadHelper
{ #region SaveVideoFirstImg 根据视频路径生成视频对应的图片
/// <summary>
/// 根据视频路径生成视频对应的图片
/// </summary>
/// <param name="videoUrl">视频的绝对路径</param>
public static void SaveVideoFirstImg(string videoUrl)
{
var saveFileurl = videoUrl.Substring(, videoUrl.LastIndexOf(".")) + ".jpg";
Process p = new Process();
p.StartInfo.FileName = string.Format("{0}\\ffmpeg.exe", HttpContext.Current.Server.MapPath("~/media/"));
p.StartInfo.CreateNoWindow = true;
p.StartInfo.UseShellExecute = false;
p.StartInfo.Arguments = string.Format("-i {0} -y -f image2 -t 1 {1}", videoUrl, saveFileurl);
p.Start();
p.WaitForExit();
p.Close();
p.Dispose();
}
#endregion #region CompressImg 生成缩略图方法
/// <summary>
/// 生成缩略图方法
/// </summary>
/// <param name="oldUrl">完整原始图片路径</param>
/// <param name="newUrl">完整缩略图路径</param>
/// <param name="thumbWidth">缩略图宽度</param>
/// <param name="thumbHeight">缩略图高度</param>
/// <returns>成功生成返回true,失败生成返回false</returns>
public static bool CompressImg(string oldUrl, string newUrl, double thumbWidth, double thumbHeight)
{
if (File.Exists(oldUrl))
{
//原图加载
using (System.Drawing.Image sourceImage = System.Drawing.Image.FromFile(oldUrl))
{
var imgFormate = GetImageFormat(sourceImage); //原图宽高均小于模版,不作处理,直接保存
if (sourceImage.Width <= thumbWidth && sourceImage.Height <= thumbHeight)
{
//保存
sourceImage.Save(newUrl, imgFormate);
}
else
{
//缩略图宽、高计算
double newWidth = sourceImage.Width;
double newHeight = sourceImage.Height; //宽大于高或宽等于高(横图或正方)
if (sourceImage.Width >= sourceImage.Height)
{
//如果宽大于模版
if (sourceImage.Width > thumbWidth)
{
//宽按模版,高按比例缩放
newWidth = thumbWidth;
newHeight = sourceImage.Height * (thumbWidth / sourceImage.Width);
}
}
//高大于宽(竖图)
else
{
//如果高大于模版
if (sourceImage.Height > thumbHeight)
{
//高按模版,宽按比例缩放
newHeight = thumbHeight;
newWidth = sourceImage.Width * (thumbHeight / sourceImage.Height);
}
} //判断是否为gif或者tiff图片
if (imgFormate == ImageFormat.Gif || imgFormate == ImageFormat.Tiff)
{
//压缩图片
CompressImgGif(sourceImage, imgFormate, newUrl, (int)newWidth, (int)newHeight);
}
else //其它格式图片
{
//生成新图,新建一个bmp图片
System.Drawing.Image newImage = new System.Drawing.Bitmap((int)newWidth, (int)newHeight); //新建一个画板
System.Drawing.Graphics newG = System.Drawing.Graphics.FromImage(newImage); //置背景色
newG.Clear(Color.Transparent); //设置质量
newG.InterpolationMode = InterpolationMode.HighQualityBicubic;
newG.SmoothingMode = SmoothingMode.HighQuality; //画图
newG.DrawImage(sourceImage, new System.Drawing.Rectangle(, , newImage.Width, newImage.Height), new System.Drawing.Rectangle(, , sourceImage.Width, sourceImage.Height), System.Drawing.GraphicsUnit.Pixel); newImage.Save(newUrl, imgFormate); //释放资源
newG.Dispose();
newImage.Dispose();
}
}
}
return true;
} return false;
}
#endregion #region CompressImgGif 压缩gif图片
/// <summary>
/// 压缩gif图片
/// </summary>
/// <param name="oldUrl"></param>
/// <param name="newUrl"></param>
/// <param name="thumbWidth"></param>
/// <param name="thumbHeight"></param>
public static void CompressImgGif(Image sourceImage, ImageFormat format, string newUrl, int width, int height)
{
//新图第一帧
Image new_img = new Bitmap(width, height); //新图其他帧
Image new_imgs = new Bitmap(width, height); //新图第一帧GDI+绘图对象
Graphics g_new_img = Graphics.FromImage(new_img); //新图其他帧GDI+绘图对象
Graphics g_new_imgs = Graphics.FromImage(new_imgs); //配置新图第一帧GDI+绘图对象
g_new_img.CompositingMode = CompositingMode.SourceCopy;
g_new_img.InterpolationMode = InterpolationMode.HighQualityBicubic;
g_new_img.PixelOffsetMode = PixelOffsetMode.HighQuality;
g_new_img.SmoothingMode = SmoothingMode.HighQuality;
g_new_img.Clear(Color.FromKnownColor(KnownColor.Transparent)); //配置其他帧GDI+绘图对象
g_new_imgs.CompositingMode = CompositingMode.SourceCopy;
g_new_imgs.InterpolationMode = InterpolationMode.HighQualityBicubic;
g_new_imgs.PixelOffsetMode = PixelOffsetMode.HighQuality;
g_new_imgs.SmoothingMode = SmoothingMode.HighQuality;
g_new_imgs.Clear(Color.FromKnownColor(KnownColor.Transparent)); //遍历维数
foreach (Guid gid in sourceImage.FrameDimensionsList)
{
//因为是缩小GIF文件所以这里要设置为Time
//如果是TIFF这里要设置为PAGE
FrameDimension f = format == ImageFormat.Gif ? FrameDimension.Time : FrameDimension.Page; //获取总帧数
int count = sourceImage.GetFrameCount(f);
//保存标示参数
System.Drawing.Imaging.Encoder encoder = System.Drawing.Imaging.Encoder.SaveFlag;
//
EncoderParameters ep = null; //每一帧
for (int c = ; c < count; c++)
{
//选择由维度和索引指定的帧
sourceImage.SelectActiveFrame(f, c);
//第一帧
if (c == )
{
//将原图第一帧画给新图第一帧
g_new_img.DrawImage(sourceImage, new Rectangle(, , new_img.Width,new_img.Height), new Rectangle(, , sourceImage.Width, sourceImage.Height), GraphicsUnit.Pixel); //把振频和透明背景调色板等设置复制给新图第一帧
for (int i = ; i < sourceImage.PropertyItems.Length; i++)
{
new_img.SetPropertyItem(sourceImage.PropertyItems[i]);
}
ep = new EncoderParameters();
//第一帧需要设置为MultiFrame
ep.Param[] = new EncoderParameter(encoder, (long)EncoderValue.MultiFrame); //保存第一帧
new_img.Save(newUrl, GetCodecInfo(format.Guid), ep);
}
//其他帧
else
{
//把原图的其他帧画给新图的其他帧
g_new_imgs.DrawImage(sourceImage, new Rectangle(, , new_imgs.Width,new_imgs.Height), new Rectangle(, , sourceImage.Width, sourceImage.Height), GraphicsUnit.Pixel); //把振频和透明背景调色板等设置复制给新图第一帧
for (int i = ; i < sourceImage.PropertyItems.Length; i++)
{
new_imgs.SetPropertyItem(sourceImage.PropertyItems[i]);
}
ep = new EncoderParameters(); //如果是GIF这里设置为FrameDimensionTime
//如果为TIFF则设置为FrameDimensionPage
ep.Param[] = new EncoderParameter(encoder, (long)(format == ImageFormat.Gif ? EncoderValue.FrameDimensionTime : EncoderValue.FrameDimensionPage)); //向新图添加一帧
new_img.SaveAdd(new_imgs, ep);
}
} ep = new EncoderParameters();
//关闭多帧文件流
ep.Param[] = new EncoderParameter(encoder, (long)EncoderValue.Flush);
new_img.SaveAdd(ep);
} //释放文件
new_img.Dispose();
new_imgs.Dispose();
g_new_img.Dispose();
g_new_imgs.Dispose();
}
#endregion #region 压缩文件
/// <summary>
/// 压缩文件
/// </summary>
/// <param name="oldImg"></param>
/// <param name="newImg"></param>
public static void CompressSize(string oldImg, string newImg)
{ using (System.Drawing.Image sourceImage = System.Drawing.Image.FromFile(oldImg))
{
Bitmap bmp = new Bitmap(sourceImage);
KiSaveAsJPEG(bmp, newImg, );
} } //// <summary>
/// 保存为JPEG格式,支持压缩质量选项
/// </summary>
/// <param name="bmp"></param>
/// <param name="FileName"></param>
/// <param name="Qty"></param>
/// <returns></returns>
public static bool KiSaveAsJPEG(Bitmap bmp, string FileName, int Qty)
{
try
{
EncoderParameter p;
EncoderParameters ps; ps = new EncoderParameters(); p = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, Qty);
ps.Param[] = p; bmp.Save(FileName, GetCodecInfo("image/jpeg"), ps); return true;
}
catch
{
return false;
}
} //// <summary>
/// 获取codeinfo
/// </summary>
/// <param name="mimeType"></param>
/// <returns>得到指定mimeType的ImageCodecInfo</returns>
private static ImageCodecInfo GetCodecInfo(string mimeType)
{
ImageCodecInfo[] CodecInfo = ImageCodecInfo.GetImageEncoders();
foreach (ImageCodecInfo ici in CodecInfo)
{
if (ici.MimeType == mimeType) return ici;
}
return null;
} /// <summary>
/// 获取codeinfo
/// </summary>
/// <param name="guid"></param>
/// <returns></returns>
public static ImageCodecInfo GetCodecInfo(Guid guid)
{
ImageCodecInfo[] icis = ImageCodecInfo.GetImageDecoders(); //为 图片编码、解码器 对象 赋值
foreach (ImageCodecInfo ici in icis)
{
if (ici.FormatID == guid)
{
return ici;
}
} return null;
}
#endregion #region GetImageFormat 获取图片文件格式
/// <summary>
/// 获取图片文件格式
/// </summary>
/// <param name="img"></param>
/// <returns></returns>
public static ImageFormat GetImageFormat(Image img)
{
if (img != null)
{
ImageFormat fileExtension = img.RawFormat,
jpgExtension = ImageFormat.Jpeg,
gifExtension = ImageFormat.Gif,
pngExtension = ImageFormat.Png,
iconExtension = ImageFormat.Icon,
bmpExtension = ImageFormat.Bmp,
tiffExtension = ImageFormat.Tiff,
wmfExtension = ImageFormat.Wmf,
emfExtension = ImageFormat.Emf,
exifExtension = ImageFormat.Exif; if (fileExtension.Equals(jpgExtension))
{
return ImageFormat.Jpeg;
}
else if (fileExtension.Equals(gifExtension))
{
return ImageFormat.Gif;
}
else if (fileExtension.Equals(pngExtension))
{
return ImageFormat.Png;
}
else if (fileExtension.Equals(iconExtension))
{
return ImageFormat.Icon;
}
else if (fileExtension.Equals(bmpExtension))
{
return ImageFormat.Bmp;
}
else if (fileExtension.Equals(tiffExtension))
{
return ImageFormat.Tiff;
}
else if (fileExtension.Equals(wmfExtension))
{
return ImageFormat.Wmf;
}
else if (fileExtension.Equals(emfExtension))
{
return ImageFormat.Emf;
}
else if (fileExtension.Equals(exifExtension))
{
return ImageFormat.Exif;
}
}
return ImageFormat.Jpeg;
}
#endregion #region GetExtension 获得上传文件的扩展名
/// <summary>
/// 获得上传文件的扩展名
/// </summary>
/// <param name="img"></param>
/// <returns></returns>
public static string GetExtension(Image img)
{
if (img != null)
{
ImageFormat fileExtension = img.RawFormat,
jpgExtension = ImageFormat.Jpeg,
gifExtension = ImageFormat.Gif,
pngExtension = ImageFormat.Png,
iconExtension = ImageFormat.Icon,
bmpExtension = ImageFormat.Bmp,
tiffExtension = ImageFormat.Tiff,
wmfExtension = ImageFormat.Wmf,
emfExtension = ImageFormat.Emf,
exifExtension = ImageFormat.Exif; if (fileExtension.Equals(jpgExtension))
{
return ".jpg";
}
else if (fileExtension.Equals(gifExtension))
{
return ".gif";
}
else if (fileExtension.Equals(pngExtension))
{
return ".png";
}
else if (fileExtension.Equals(iconExtension))
{
return ".icon";
}
else if (fileExtension.Equals(bmpExtension))
{
return ".bmp";
}
else if (fileExtension.Equals(tiffExtension))
{
return ".tiff";
}
else if (fileExtension.Equals(wmfExtension))
{
return ".wmf";
}
else if (fileExtension.Equals(emfExtension))
{
return ".emf";
}
else if (fileExtension.Equals(exifExtension))
{
return ".exif";
}
}
return ".jpg";
}
#endregion } #region UploadImageMsg 上传图片后返回上传结果
/// <summary>
/// 上传图片后返回上传结果
/// </summary>
public class UploadImageMsg
{
public UploadImageMsg()
{
error = ;
url = message = string.Empty;
} /// <summary>
/// 1错误 0成功
/// </summary>
public int error { get; set; }
/// <summary>
/// 错误信息
/// </summary>
public string message { get; set; }
/// <summary>
/// 上传成功的url路径
/// </summary>
public string url { get; set; }
}
#endregion

文件上传,服务端压缩文件方法,重点是png与gif图片的压缩,保证了透明度与动画的更多相关文章

  1. nodejs 文件上传服务端实现

    前段时间在做个人项目的时候,用到了nodejs服务端上传文件,现在回头把这个小结一下,作为记录. 本人上传文件时是基于express的multiparty,当然也可以使用connect-multipa ...

  2. PHP 文件上传服务端及客户端配置参数说明

    文件上传服务器端配置: ·file_uploads = On, 支持HTTP上传 ·upload_tmp_dir = , 临时文件保存的目录 ·upload_max_filesize=2M, 允许上传 ...

  3. web安全之文件上传漏洞攻击与防范方法

    一. 文件上传漏洞与WebShell的关系 文件上传漏洞是指网络攻击者上传了一个可执行的文件到服务器并执行.这里上传的文件可以是木马,病毒,恶意脚本或者WebShell等.这种攻击方式是最为直接和有效 ...

  4. 构建基于阿里云OSS文件上传服务

    转载请注明来源:http://blog.csdn.net/loongshawn/article/details/50710132 <构建基于阿里云OSS文件上传服务> <构建基于OS ...

  5. Java FtpClient 实现文件上传服务

    一.Ubuntu 安装 Vsftpd 服务 1.安装 sudo apt-get install vsftpd 2.添加用户(uftp) sudo useradd -d /home/uftp -s /b ...

  6. php文件上传大小限制的修改方法大全

    php文件上传大小限制的修改方法大全 基本就是修改maxsize选项,当然为了提高上传文件的成功率,还需要设置超时时间等. 文章如下: [php文件上传]php文件上传大小限制修改,phpmyadmi ...

  7. django设置并获取cookie&sol;session,文件上传,ajax接收文件,post&sol;get请求及跨域请求等的方法

    django设置并获取cookie/session,文件上传,ajax接收文件等的方法: views.py文件: from django.shortcuts import render,HttpRes ...

  8. HTTP文件上传服务器-支持超大文件HTTP断点续传的实现办法

    最近由于笔者所在的研发集团产品需要,需要支持高性能的大文件http上传,并且要求支持http断点续传.笔者在以前的博客如何实现支持大文件的高性能HTTP文件上传服务器已经介绍了实现大文件上传的一些基本 ...

  9. 精讲RestTemplate第6篇-文件上传下载与大文件流式下载

    本文是精讲RestTemplate第6篇,前篇的blog访问地址如下: 精讲RestTemplate第1篇-在Spring或非Spring环境下如何使用 精讲RestTemplate第2篇-多种底层H ...

  10. php 文件上传后缀名与文件类型对照表&lpar;几乎涵盖所有文件&rpar;

    网上有很多php文件上传的类,文件上传处理是php的一个特色(至少手册上是将此作为php特点来展示的,个人认为php在数组方面的优异功能更有特 色),学php的人都知道文件上传怎么做,但很多人在编程中 ...

随机推荐

  1. 【小白的CFD之旅】10 敲门实例

    按黄师姐的说法,做好第一个案例很重要.第一个案例既可以帮助理解CFD的工作流程,还可以帮助熟悉软件的操作界面. 黄师姐推荐的入门案例来自于ANSYS官方提供的培训教程,是一个关于交叉管内流动混合的案例 ...

  2. rabbitmq&lowbar;hearbeat

    heartbeat[心跳检测],用于报告客户端与服务器之间连接的一种检测机制.在rabbitmq中有Sender和consumer. 为了确保rabbitmq与客户端的状态,需启用heartbeat. ...

  3. kd tree学习笔记 &lpar;最近邻域查询&rpar;

    https://zhuanlan.zhihu.com/p/22557068 http://blog.csdn.net/zhjchengfeng5/article/details/7855241 KD树 ...

  4. 基础-训练营-day1~day5

    基础 大纲  变量:      声明.初始化.使用.命名  数据类型:      int.long.double.boolean.char.String  运算符:      赋值.算术.关系.逻辑  ...

  5. css中的关于margin-top,position和z-index的一些bug解决方案

    这两天在写一个demo的时候,就碰到一些css的问题,不知道能不能算bug,很有可能是因为我写的代码太少,孤陋寡闻了_(:зゝ∠)_.记录一下,以防下次遇到同样问题. 进入正题: 1.问题描述:div ...

  6. nodejs 全局变量

    1.全局对象 所有模块都可以调用 1)global:表示Node所在的全局环境,类似于浏览器中的window对象. 2)process:指向Node内置的process模块,允许开发者与当前进程互动. ...

  7. 信号为E时,如何让语音识别脱&OpenCurlyDoubleQuote;网”而出?

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯教育云发表于云+社区专栏 一般没有网络时,语音识别是这样的 ▽ 而同等环境下,嵌入式语音识别,是这样的 ▽ 不仅可以帮您边说边识. ...

  8. SpringBoot自定义线程池处理异步任务

    @Async异步调用 就不解释什么是异步调用了,Spring Boot中进行异步调用很简单 1.通过使用@Async注解就能简单的将原来的同步函数变为异步函数 package com.winner.s ...

  9. 第二次结对作业-WordCount进阶需求

    原博客 队友博客 github项目地址 目录 具体分工 需求分析 PSP表格 解题思路描述与设计实现说明 爬虫使用 代码组织与内部实现设计(类图) 算法的关键与关键实现部分流程图 附加题设计与展示 设 ...

  10. Informatica 常用组件Aggregator之三 使用排序输入

    可以使用排序输入选项改善聚合转换性能.使用排序输入时,PowerCenter 会假定所有数据已按组排序.PowerCenter 读取某组的行时,它将执行聚合计算.需要时,它会将组信息存储在存储器中.要 ...