zoukankan
html css js c++ java
Asp.net真正生成高质量不变形缩略图片
方法一:
C# 代码
///
<summary>
///
生成缩略图
///
</summary>
///
<param name="originalImagePath">
源图路径(物理路径)
</param>
///
<param name="thumbnailPath">
缩略图路径(物理路径)
</param>
///
<param name="width">
缩略图宽度
</param>
///
<param name="height">
缩略图高度
</param>
///
<param name="mode">
生成缩略图的方式
</param>
public
static
void
MakeThumbnail(
string
originalImagePath,
string
thumbnailPath,
int
width,
int
height,
string
mode)
...
{
Image originalImage
=
Image.FromFile(originalImagePath);
int
towidth
=
width;
int
toheight
=
height;
int
x
=
0
;
int
y
=
0
;
int
ow
=
originalImage.Width;
int
oh
=
originalImage.Height;
switch
(mode)
...
{
case
"
HW
"
:
//
指定高宽缩放(可能变形)
break
;
case
"
W
"
:
//
指定宽,高按比例
toheight
=
originalImage.Height
*
width
/
originalImage.Width;
break
;
case
"
H
"
:
//
指定高,宽按比例
towidth
=
originalImage.Width
*
height
/
originalImage.Height;
break
;
case
"
Cut
"
:
//
指定高宽裁减
if
((
double
)originalImage.Width
/
(
double
)originalImage.Height
>
(
double
)towidth
/
(
double
)toheight)
...
{
oh
=
originalImage.Height;
ow
=
originalImage.Height
*
towidth
/
toheight;
y
=
0
;
x
=
(originalImage.Width
-
ow)
/
2
;
}
else
...
{
ow
=
originalImage.Width;
oh
=
originalImage.Width
*
height
/
towidth;
x
=
0
;
y
=
(originalImage.Height
-
oh)
/
2
;
}
break
;
case
"
CutA
"
:
//
指定高宽裁减(不变形)自定义
if
(ow
<=
towidth
&&
oh
<=
toheight)
...
{
x
=-
(towidth
-
ow)
/
2
;
y
=-
(toheight
-
oh)
/
2
;
ow
=
towidth;
oh
=
toheight;
}
else
...
{
if
(ow
>
oh)
//
宽大于高
...
{
x
=
0
;
y
=-
(ow
-
oh)
/
2
;
oh
=
ow;
}
else
//
高大于宽
...
{
y
=
0
;
x
=-
(oh
-
ow)
/
2
;
ow
=
oh;
}
}
break
;
default
:
break
;
}
//
新建一个bmp图片
Image bitmap
=
new
System.Drawing.Bitmap(towidth,toheight);
//
新建一个画板
Graphics g
=
System.Drawing.Graphics.FromImage(bitmap);
//
设置高质量插值法
g.InterpolationMode
=
System.Drawing.Drawing2D.InterpolationMode.High;
//
设置高质量,低速度呈现平滑程度
g.SmoothingMode
=
System.Drawing.Drawing2D.SmoothingMode.HighQuality;
//
清空画布并以白色背景色填充
g.Clear(Color.White);
//
在指定位置并且按指定大小绘制原图片的指定部分
g.DrawImage(originalImage,
new
Rectangle(
0
,
0
, towidth, toheight),
new
Rectangle(x, y, ow,oh),
GraphicsUnit.Pixel);
try
...
{
//
以jpg格式保存缩略图
bitmap.Save(thumbnailPath, System.Drawing.Imaging.ImageFormat.Jpeg);
}
catch
(System.Exception e)
...
{
throw
e;
}
finally
...
{
originalImage.Dispose();
bitmap.Dispose();
g.Dispose();
}
}
方法二:
C# 代码
///
<summary>
///
Class1 的摘要说明
///
</summary>
public
class
Class1
...
{
public
static
void
SendSmallImage(
string
fileName,
string
newFile,
int
maxHeight,
int
maxWidth)
...
{
System.Drawing.Image img
=
System.Drawing.Image.FromFile(fileName);
System.Drawing.Imaging.ImageFormat thisFormat
=
img.RawFormat;
Size newSize
=
NewSize(maxWidth, maxHeight, img.Width, img.Height);
Bitmap outBmp
=
new
Bitmap(newSize.Width, newSize.Height);
Graphics g
=
Graphics.FromImage(outBmp);
//
设置画布的描绘质量
g.CompositingQuality
=
CompositingQuality.HighQuality;
g.SmoothingMode
=
SmoothingMode.HighQuality;
g.InterpolationMode
=
InterpolationMode.HighQualityBicubic;
g.DrawImage(img,
new
Rectangle(
0
,
0
, newSize.Width, newSize.Height),
0
,
0
, img.Width, img.Height, GraphicsUnit.Pixel);
g.Dispose();
//
以下代码为保存图片时,设置压缩质量
EncoderParameters encoderParams
=
new
EncoderParameters();
long
[] quality
=
new
long
[
1
];
quality[
0
]
=
80
;
EncoderParameter encoderParam
=
new
EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);
encoderParams.Param[
0
]
=
encoderParam;
//
获得包含有关内置图像编码解码器的信息的ImageCodecInfo 对象。
ImageCodecInfo[] arrayICI
=
ImageCodecInfo.GetImageEncoders();
ImageCodecInfo jpegICI
=
null
;
for
(
int
x
=
0
; x
<
arrayICI.Length; x
++
)
...
{
string
Format
=
arrayICI[x].FormatDe script _ ion;
if
(arrayICI[x].FormatDe script _ ion.Equals(
"
JPEG
"
))
...
{
jpegICI
=
arrayICI[x];
//
设置JPEG编码
break
;
}
}
if
(jpegICI
!=
null
)
...
{
outBmp.Save(newFile, jpegICI, encoderParams);
}
else
...
{
outBmp.Save(newFile, thisFormat);
}
img.Dispose();
outBmp.Dispose();
}
private
static
Size NewSize(
int
maxWidth,
int
maxHeight,
int
width,
int
height)
...
{
double
w
=
0.0
;
double
h
=
0.0
;
double
sw
=
Convert.ToDouble(width);
double
sh
=
Convert.ToDouble(height);
double
mw
=
Convert.ToDouble(maxWidth);
double
mh
=
Convert.ToDouble(maxHeight);
if
(sw
<
mw
&&
sh
<
mh)
...
{
w
=
sw;
h
=
sh;
}
else
if
((sw
/
sh)
>
(mw
/
mh))
...
{
w
=
maxWidth;
h
=
(w
*
sh)
/
sw;
}
else
...
{
h
=
maxHeight;
w
=
(h
*
sw)
/
sh;
}
return
new
Size(Convert.ToInt32(w), Convert.ToInt32(h));
}
}
查看全文
相关阅读:
使用 Node.js 实现简单的 Webhook
乐橙平台大华监控Android端实时预览播放
解决ScrollView嵌套百度地图滑动冲突
解决ViewPager与百度地图滑动冲突
SpringBoot+MybatisPlus+MySql 自动生成代码 自动分页
SpringBoot+Mybatis+MySql 自动生成代码 自动分页
Android MVP框架实现登录案例
Android属性动画-简单实例
SpringBoot2+Druid+JdbcTemplate+MySql实现增删改查
SpringBoot2+Druid+MyBatis+MySql实现增删改查
原文地址:https://www.cnblogs.com/leeolevis/p/1383132.html
最新文章
游标使用
DotNETCore 学习笔记 WebApi
DotNETCore 学习笔记 MVC视图
SQL Server Delete Duplicate Rows
DotNet 学习笔记 OWIN
深入了解 Cloud Studio 开发在云端
使用 Chrome Timeline 来优化页面性能
如何部署软件
使用原理视角看 Git
Git 客户端在 WebIDE 中的实现
热门文章
CODING 代码托管架构升级之路
Coding CTO 孙宇聪:《人,技术与流程》
聊聊前端开发的测试
如何通过 HSB 颜色模式构建夜间模式
Java 文件句柄泄露问题解决小记
[译] 关于 Git 你需要知道的一些事情
让开发更简单 —— Coding Enterprise 发布
Spring MVC 与 CORS
Appium 在 Android UI 测试中的应用
Coding 如何使用 Coding 开发 Coding
Copyright © 2011-2022 走看看