zoukankan
html css js c++ java
一個圖片縮放類(按長寬比例縮放,自定義長寬縮放)
public
class
Thumbnail
{
/**/
///
<summary>
///
制作缩略图(如果原圖長大於寬以長為基准縮放,反之以寬為基准縮放)
///
</summary>
///
<param name="fileName">
原图路径
</param>
///
<param name="newFileName">
新图路径
</param>
///
<param name="maxWidth">
最大宽度
</param>
///
<param name="maxHeight">
最大高度
</param>
public
static
void
MakeThumbnailImage(
string
fileName,
string
newFileName,
int
maxWidth,
int
maxHeight)
{
Image original
=
Image.FromFile(fileName);
Size _newSize
=
ResizeImage(original.Width, original.Height, maxWidth, maxHeight);
//
_image.Height = _newSize.Height;
//
_image.Width = _newSize.Width;
Image displayImage
=
new
Bitmap(original, _newSize);
try
{
Image tempImage
=
displayImage;
original.Dispose();
tempImage.Save(newFileName, GetFormat(fileName));
}
finally
{
original.Dispose();
}
}
/**/
///
<summary>
///
计算新尺寸
///
</summary>
///
<param name="width">
原始宽度
</param>
///
<param name="height">
原始高度
</param>
///
<param name="maxWidth">
最大新宽度
</param>
///
<param name="maxHeight">
最大新高度
</param>
///
<returns></returns>
private
static
Size ResizeImage(
int
width,
int
height,
int
maxWidth,
int
maxHeight)
{
decimal
MAX_WIDTH
=
(
decimal
)maxWidth;
decimal
MAX_HEIGHT
=
(
decimal
)maxHeight;
decimal
ASPECT_RATIO
=
MAX_WIDTH
/
MAX_HEIGHT;
int
newWidth, newHeight;
decimal
originalWidth
=
(
decimal
)width;
decimal
originalHeight
=
(
decimal
)height;
if
(originalWidth
>
MAX_WIDTH
||
originalHeight
>
MAX_HEIGHT)
{
decimal
factor;
//
determine the largest factor
if
(originalWidth
/
originalHeight
>
ASPECT_RATIO)
{
factor
=
originalWidth
/
MAX_WIDTH;
newWidth
=
Convert.ToInt32(originalWidth
/
factor);
newHeight
=
Convert.ToInt32(originalHeight
/
factor);
}
else
{
factor
=
originalHeight
/
MAX_HEIGHT;
newWidth
=
Convert.ToInt32(originalWidth
/
factor);
newHeight
=
Convert.ToInt32(originalHeight
/
factor);
}
}
else
{
newWidth
=
width;
newHeight
=
height;
}
return
new
Size(newWidth, newHeight);
}
/**/
///
<summary>
///
保存图片
///
</summary>
///
<param name="image">
Image 对象
</param>
///
<param name="savePath">
保存路径
</param>
///
<param name="ici">
指定格式的编解码参数
</param>
private
static
void
SaveImage(Image image,
string
savePath, ImageCodecInfo ici)
{
//
设置 原图片 对象的 EncoderParameters 对象
EncoderParameters parameters
=
new
EncoderParameters(
1
);
parameters.Param[
0
]
=
new
EncoderParameter(Encoder.Quality, ((
long
)
100
));
image.Save(savePath, ici, parameters);
parameters.Dispose();
}
/**/
///
<summary>
///
获取图像编码解码器的所有相关信息
///
</summary>
///
<param name="mimeType">
包含编码解码器的多用途网际邮件扩充协议 (MIME) 类型的字符串
</param>
///
<returns>
返回图像编码解码器的所有相关信息
</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>
///
得到图片格式
///
</summary>
///
<param name="name">
文件名称
</param>
///
<returns></returns>
public
static
ImageFormat GetFormat(
string
name)
{
string
ext
=
name.Substring(name.LastIndexOf(
"
.
"
)
+
1
);
switch
(ext.ToLower())
{
case
"
jpg
"
:
case
"
jpeg
"
:
return
ImageFormat.Jpeg;
case
"
bmp
"
:
return
ImageFormat.Bmp;
case
"
png
"
:
return
ImageFormat.Png;
case
"
gif
"
:
return
ImageFormat.Gif;
default
:
return
ImageFormat.Jpeg;
}
}
/**/
///
<summary>
///
自定義縮放圖(縮略圖時以圖頂端為起點)
///
</summary>
///
<param name="fileName"></param>
///
<param name="newFileName"></param>
///
<param name="newWidth"></param>
///
<param name="newHeight"></param>
public
static
void
MakeCustomImage(
string
fileName,
string
newFileName,
int
newWidth,
int
newHeight)
{
Image image
=
Image.FromFile(fileName);
int
i
=
0
;
int
width
=
image.Width;
int
height
=
image.Height;
if
(width
>
height)
{
i
=
height;
}
else
{
i
=
width;
}
Bitmap b
=
new
Bitmap(newWidth, newHeight);
try
{
Graphics g
=
Graphics.FromImage(b);
g.InterpolationMode
=
InterpolationMode.High;
g.SmoothingMode
=
SmoothingMode.HighQuality;
//
清除整个绘图面并以透明背景色填充
g.Clear(Color.Transparent);
if
(width
<
height)
{
g.DrawImage(image,
new
Rectangle(
0
,
0
, newWidth, newHeight),
new
Rectangle((width
-
newWidth)
/
2
,
0
, newWidth,newHeight), GraphicsUnit.Pixel);
}
else
{
g.DrawImage(image,
new
Rectangle(
0
,
0
, newWidth, newHeight),
new
Rectangle((width
-
newWidth)
/
2
,
0
, newWidth, newHeight), GraphicsUnit.Pixel);
}
image.Dispose();
SaveImage(b, newFileName, GetCodecInfo(
"
image/
"
+
GetFormat(fileName).ToString().ToLower()));
}
finally
{
image.Dispose();
b.Dispose();
}
}
}
查看全文
相关阅读:
计算机网络学习笔记——计算机网络概述
基础续一
Python基础一
linux lvm的操作手册_pvcreate_vgcreate_lvcreate_相关
Oracle Linux 挂载存储
MegaCLI SAS RAID Management Tool
DELL RACADM 批量升级戴尔IDRAC固件
LSI MegaCli 命令使用4
LSI MegaCli 命令使用2
LSI MegaCl i命令使用1
原文地址:https://www.cnblogs.com/wang123/p/1200060.html
最新文章
电脑术语整理
jemeter断言和性能分析
接口术语
jdk安装逻辑学习笔记
git的使用学习笔记1
手工接口测试到自动化框架设计
接口自动化落地过程
10个关于Android开发的实用教程
爱加密受邀参加2015中国互联网金融发展峰会
为什么不能往Android的Application对象里存储数据
热门文章
“互联网+”时代,移动应用安全解决之道
我有一个idea,但是没有钱,又没技术怎么办?
养活一款APP要“烧”多少钱?
性能优化之数据库优化
减少C++代码编译时间的方法
精品JS代码收藏大全
15个开发者最亲睐的Android代码编辑器
计算机网络学习笔记——数据链路层
Hello CNBLOGS
计算机网络学习笔记——物理层
Copyright © 2011-2022 走看看