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));
}
}
查看全文
相关阅读:
Tomcat Manager用户配置详解
自动更新Chromium
如何方便快速在指定文件夹打开命令行
让Chrome 接管邮件连接,收发邮件更方便了
Chrome扩展程序的二次开发:把它改得更适合自己使用
更改Photoshop 语言为英语(无需语言包)
Chrome 控制台新玩法-console显示图片以及为文字加样式
JavaScript—之对象参数的引用传递
jQuery 绑定事件到动态创建的元素上
JavaScript –类型之我晕
原文地址:https://www.cnblogs.com/leeolevis/p/1383132.html
最新文章
远程桌面管理好用工具
Android----Thread+Handler 线程 消息循环(转载)
Android开发网上的一些重要知识点[经验分享]
【脚下生根】之深度探索安卓OpenGL投影矩阵
[Android实例] Android之断点续传下载
Android MD5校验码的生成与算法实现
搞不懂为什么开发人员爱iOS恨Android?
apk 静默安装
Android 获取包名,版本信息
安卓高手之路之ClassLoader(三)
热门文章
安卓高手之路之ClassLoader(二)
synchronized
详细介绍Base64的编码转换方式
AtomicInteger简介
ExecutorService常用方法和newFixedThreadPool创建固定大小的线程池
AsyncContext简介
《java虚拟机》汇总所有关键要点
jvm java虚拟机 新生代的配置
根据类名查找jar包
解决myeclipse/eclipse创建或导入maven工程时引发的问题
Copyright © 2011-2022 走看看