圖片比例縮放 不丟真的C#程式碼----努力加汗水哦

hljhrbsjf發表於2011-05-12
公司做了個圖片網站,但是我用了XInfo.Common.Tools.MyImage元件卻發現圖片縮放後嚴重的丟真
徐哥也很不滿意,強烈要求我必須解決這個問題 所以我就在網站查了很多東東,不過好象都不好用
最後我找到了一個不丟真的縮放程式碼,但不是按照比例縮放的,我又找了個一個比例縮放的程式碼
兩者結合一下,從新改了函式,居然成功了,哈哈 我突然發現我太天才了
我把程式碼發上來吧 以便網友們使用 嘿嘿
//使用方法呼叫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;
}
[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/631872/viewspace-1049782/,如需轉載,請註明出處,否則將追究法律責任。

相關文章