C# 图片等比例不丢真缩放

1.参考文献:http://blog.itpub.net/631872/viewspace-1049782/

2.实现方法:

//使用方法调用GenerateHighThumbnail()方法即可
//参数oldImagePath表示要被缩放的图片路径
//参数newImagePath表示缩放后保存的图片路径
//参数width和height分别是缩放范围宽和高
public static void GenerateHighThumbnail(string oldImagePath, string newImagePath, int width, int height)
{
	System.Drawing.Image oldImage = System.Drawing.Image.FromFile(oldImagePath);
	int newWidth = AdjustSize(width, height, oldImage.Width, oldImage.Height).Width;
	int newHeight =AdjustSize(width, height, oldImage.Width, oldImage.Height).Height;
	//。。。。。。。。。。。
	System.Drawing.Image thumbnailImage = oldImage.GetThumbnailImage(newWidth, newHeight,new System.Drawing.Image.GetThumbnailImageAbort(ThumbnailCallback), IntPtr.Zero);
	System.Drawing.Bitmap bm = new System.Drawing.Bitmap(thumbnailImage);
	//处理JPG质量的函数
	System.Drawing.Imaging.ImageCodecInfo ici = GetEncoderInfo("image/jpeg");
	if (ici != null)
	{
		System.Drawing.Imaging.EncoderParameters ep = new System.Drawing.Imaging.EncoderParameters(1);
		ep.Param[0] = new System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.Quality, (long)100);
		bm.Save(newImagePath, ici, ep);
		//释放所有资源,不释放,可能会出错误。
		ep.Dispose();
		ep = null;
	}
	ici = null;
	bm.Dispose();
	bm = null;
	thumbnailImage.Dispose();
	thumbnailImage = null;
	oldImage.Dispose();
	oldImage = null;
}


private static bool ThumbnailCallback()
{
	return false;
}


private static ImageCodecInfo GetEncoderInfo(String mimeType)
{
	int j;
	ImageCodecInfo[] encoders;
	encoders = ImageCodecInfo.GetImageEncoders();
	for (j = 0; j < encoders.Length; ++j)
	{
		if (encoders[j].MimeType == mimeType)
		return encoders[j];
	}
	return null;
}


public struct PicSize
{
	public int Width;
	public int Height;
}


public static PicSize AdjustSize(int spcWidth, int spcHeight, int orgWidth, int orgHeight)
{
	PicSize size = new PicSize();
	// 原始宽高在指定宽高范围内,不作任何处理 
	if (orgWidth <= spcWidth && orgHeight <= spcHeight)
	{
		size.Width = orgWidth;
		size.Height = orgHeight;
	}
	else
	{
		// 取得比例系数 
		float w = orgWidth / (float)spcWidth;
		float h = orgHeight / (float)spcHeight;
		// 宽度比大于高度比 
		if (w > h)
		{
			size.Width = spcWidth;
			size.Height = (int)(w >= 1 ? Math.Round(orgHeight / w) : Math.Round(orgHeight * w));
		}
		// 宽度比小于高度比 
		else if (w < h)
		{
			size.Height = spcHeight;
			size.Width = (int)(h >= 1 ? Math.Round(orgWidth / h) : Math.Round(orgWidth * h));
		}
		// 宽度比等于高度比 
		else
		{
			size.Width = spcWidth;
			size.Height = spcHeight;
		}
	}
	return size;
}

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值