c#生成高清缩略图的二个示例分享
发布时间:2023-04-09 23:21:46
标签:c#,缩略图
/// <summary>
/// 为图片生成缩略图
/// </summary>
/// <param name="phyPath">原图片的路径</param>
/// <param name="width">缩略图宽</param>
/// <param name="height">缩略图高</param>
/// <returns></returns>
public System.Drawing.Image GetThumbnail(System.Drawing.Image image, int width, intheight)
{
Bitmap bmp = newBitmap(width, height);
//从Bitmap创建一个System.Drawing.Graphics
System.Drawing.Graphics gr = System.Drawing.Graphics.FromImage(bmp);
//设置
gr.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
//下面这个也设成高质量
gr.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
//下面这个设成High
gr.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
//把原始图像绘制成上面所设置宽高的缩小图
System.Drawing.Rectangle rectDestination = newSystem.Drawing.Rectangle(0, 0, width, height);
gr.DrawImage(image, rectDestination, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel);
returnbmp;
}
调用方法
HttpPostedFile file = photoFile.PostedFile;
if(!file.ContentType.Contains("image"))
{
return"照片格式不合法";
}
stringext = Path.GetExtension(file.FileName).ToLower();
if (ext != ".jpg" && ext != ".gif" && ext != ".png"&& ext != ".jpeg")
{
return"请您上传jpg、gif、png图片";
}
if(file.ContentLength > 5 * 1024 * 1024)
{
return"请您上传512字节内的图片";
}
stringnewName = Guid.NewGuid().ToString();
stringtempPath = "upload/";
stringimg = tempPath + newName + ext;
stringfilePath = Server.MapPath(img);
if(!Directory.Exists(tempPath))
{
Directory.CreateDirectory(tempPath);
}
using(System.Drawing.Image originalImage = System.Drawing.Image.FromStream(file.InputStream))
{
GetThumbnail(originalImage, 504, 374).Save(filePath);
示例2
public void MakeThumbnail(string originalImagePath, string thumbnailPath, int width, int height)
{
//获取原始图片
System.Drawing.Image originalImage = System.Drawing.Image.FromFile(originalImagePath);
//缩略图画布宽高
int towidth = width;
int toheight = height;
//原始图片写入画布坐标和宽高(用来设置裁减溢出部分)
int x = 0;
int y = 0;
int ow = originalImage.Width;
int oh = originalImage.Height;
//原始图片画布,设置写入缩略图画布坐标和宽高(用来原始图片整体宽高缩放)
int bg_x = 0;
int bg_y = 0;
int bg_w = towidth;
int bg_h = toheight;
//倍数变量
double multiple = 0;
//获取宽长的或是高长与缩略图的倍数
if (originalImage.Width >= originalImage.Height)
multiple = (double)originalImage.Width / (double)width;
else
multiple = (double)originalImage.Height / (double)height;
//上传的图片的宽和高小等于缩略图
if (ow <= width && oh <= height)
{
//缩略图按原始宽高
bg_w = originalImage.Width;
bg_h = originalImage.Height;
//空白部分用背景色填充
bg_x = Convert.ToInt32(((double)towidth - (double)ow) / 2);
bg_y = Convert.ToInt32(((double)toheight - (double)oh) / 2);
}
//上传的图片的宽和高大于缩略图
else
{
//宽高按比例缩放
bg_w = Convert.ToInt32((double)originalImage.Width / multiple);
bg_h = Convert.ToInt32((double)originalImage.Height / multiple);
//空白部分用背景色填充
bg_y = Convert.ToInt32(((double)height - (double)bg_h) / 2);
bg_x = Convert.ToInt32(((double)width - (double)bg_w) / 2);
}
//新建一个bmp图片,并设置缩略图大小.
System.Drawing.Image bitmap = new System.Drawing.Bitmap(towidth, toheight);
//新建一个画板
System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bitmap);
//设置高质量插值法
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBilinear;
//设置高质量,低速度呈现平滑程度
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
//清空画布并设置背景色
g.Clear(System.Drawing.ColorTranslator.FromHtml("#F2F2F2"));
//在指定位置并且按指定大小绘制原图片的指定部分
//第一个System.Drawing.Rectangle是原图片的画布坐标和宽高,第二个是原图片写在画布上的坐标和宽高,最后一个参数是指定数值单位为像素
g.DrawImage(originalImage, new System.Drawing.Rectangle(bg_x, bg_y, bg_w, bg_h), new System.Drawing.Rectangle(x, y, ow, oh), System.Drawing.GraphicsUnit.Pixel);
try
{
//获取图片类型
string fileExtension = System.IO.Path.GetExtension(originalImagePath).ToLower();
//按原图片类型保存缩略图片,不按原格式图片会出现模糊,锯齿等问题.
switch (fileExtension)
{
case ".gif": bitmap.Save(thumbnailPath, System.Drawing.Imaging.ImageFormat.Gif); break;
case ".jpg": bitmap.Save(thumbnailPath, System.Drawing.Imaging.ImageFormat.Jpeg); break;
case ".bmp": bitmap.Save(thumbnailPath, System.Drawing.Imaging.ImageFormat.Bmp); break;
case ".png": bitmap.Save(thumbnailPath, System.Drawing.Imaging.ImageFormat.Png); break;
}
}
catch (System.Exception e)
{
throw e;
}
finally
{
originalImage.Dispose();
bitmap.Dispose();
g.Dispose();
}
}
0
投稿
猜你喜欢
- 概念IO流可以初步的理解为数据间的传输,我们将一组数据入:1234567,将他们从hello文件中转入haha文件中,使用程序的方法进行转入
- 实例如下:func exitApplication() { let app = UIApplication.sh
- 本文为大家分析了Java中字符流与字节流的区别,供大家参考,具体内容如下1. 什么是流 Java中的流是
- 一、前言最近写了个项目,前端还没写,需要部署到服务器给女朋友实现前端,可是不熟悉Linux的我,蹑手蹑脚,真的是每一步都是bug,可谓是步步
- C#byte数组与Image的相互转换实例代码功能需求:1、把一张图片(png bmp jpeg bmp gif)转换为byte数组存放到数
- 原因用Java调用雪球的API,结果返回的是乱码,一番研究后发现是因为返回的数据使用了GZIP压缩,需要先解压才能得到正确数据。思路使用了G
- 一,配置环境变量步骤1.右击桌面上的“此电脑”图标,选择属性。2.选择高级系统设置3.单击环境变量4.单击系统变量中的新建5.在变量名中输入
- 本文实例讲述了java实现ArrayList根据存储对象排序功能。分享给大家供大家参考,具体如下:与c++中的qsort的实现极为相似,构建
- 使用这个插件时要注意版本的问题,不同的版本可能 PageHelper 不会生效springboot 导入的 pagehelper 包<
- 介绍:淡入淡出动画(也称为“叠化”)逐渐淡出一个 View 或 ViewGroup,同时淡入另一个。此动画适用于您希望在应用中切换内容或视图
- 1.为什么需要动态内存分配关于这个问题,我们先看看我们之前是如何开辟内存的。int val = 20;//在栈空间上开辟四个字节char a
- 如何更改 C# Record 构造函数的行为Record[1] 是 C# 9 中的一个新功能。Record是从Structs[2]借用的特殊
- 当变换Java代码为Ceylon代码时,有时候我会遇到一些Java类构造器混淆了验证与初始化的情形。让我们使用一个简单但是人为的代码例子来说
- 什么是队列结构一种线性结构,具有特殊的运算法则【只能在一端(队头)删除,在另一端(队尾)插入】。分类:顺序队列结构链式队列结构基本操作:入队
- Mybatis-plus全局id生成策略在配置文件中加入以下代码后就不需要在实体类种的id上添加@TableId(value = “id”,
- 很多朋友在下载文件的时候,经常会发现网站提供了MD5校验码,其实这个MD5码的作用就是当你下载文件好了之后,拿你下载好的文件的MD5校验码,
- 在 Spring Boot 中做权限管理,一般来说,主流的方案是 Spring Security ,但是,仅仅从技术角度来说,也可以使用 S
- 本节只是介绍实战部分,具体的理论参数,请自行百度。所需工具:linux服务器 Jmeter测试工具 xshell &
- 正则表达式是一种描述词素的重要表示方法。虽然正则表达式并不能表达出所有可能的模式(例如“由等数量的 a 和 b 组成的字符串”),但是它可以
- 第三方jar包在开发工具中引入后编译没问题, 启动调试包括打包时会提示找不到jar包的错误.需要上传到maven仓库中,并在pom文件内引入