
如圖, 通過file input 上傳了一個檔案, 如何壓縮并上傳
不要來個 xxx.Save()啥的, 這邊不支持直接保存的,是上傳到檔案服務器, 所以要直接壓縮了轉換成steam上傳上去
uj5u.com熱心網友回復:
https://blog.csdn.net/starfd/article/details/54575199最底下有壓縮代碼,然后不管是保存到本地,還是到Stream,都是要呼叫Image的Save方法的
uj5u.com熱心網友回復:
你要壓縮后上傳,那就要用到JS了,用C#都是先上傳再壓縮的。uj5u.com熱心網友回復:
網上查了很多都寫的太復雜了, 這里自己整理了一份好像可行if (System.Web.HttpContext.Current.Request.Files.Count == 0)
{
throw new Exception("沒有選擇檔案!");
}
//這里接收來自前臺上傳的圖片
var file = System.Web.HttpContext.Current.Request.Files[0];
//檔案將要壓縮的比例(file.ContentLength是當前檔案的大小,這里默認將檔案壓縮為1024kb,可以自己調)
double compressionRatio = 1024 * 1024 / Convert.ToDouble(file.ContentLength);
compressionRatio = Math.Round(compressionRatio, 2);
//上傳檔案轉為byte陣列
byte[] fileByte = new byte[file.ContentLength];
file.InputStream.Read(fileByte, 0, file.ContentLength);
//上傳檔案的byte陣列轉為Stream
MemoryStream ms = new MemoryStream(fileByte);
Image img = Image.FromStream(ms);
//按比例計算新的寬高
int toWidth = Convert.ToInt32(img.Width * compressionRatio);
int toHeight = Convert.ToInt32(img.Height * compressionRatio);
//按照新的寬高用畫布重新畫一張
Bitmap bitmap = new Bitmap(toWidth, toHeight);
Graphics g = Graphics.FromImage(bitmap);
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
g.Clear(System.Drawing.Color.Transparent);
g.DrawImage(img, new System.Drawing.Rectangle(0, 0, toWidth, toHeight), new System.Drawing.Rectangle(0, 0, img.Width, img.Height), System.Drawing.GraphicsUnit.Pixel);
//將畫好的bitmap轉成stream(不一定費時stream,byte陣列什么都可以)
var fileStream = new MemoryStream();
using (MemoryStream stream = new MemoryStream())
{
bitmap.Save(stream, ImageFormat.Png);
byte[] data = new byte[stream.Length];
stream.Seek(0, SeekOrigin.Begin);
stream.Read(data, 0, Convert.ToInt32(stream.Length));
fileStream = new MemoryStream(data);
}
//至此,拿到壓縮好的stream或者bytes或者什么什么的 不管是上傳還是前臺顯示都可以了(#^.^#)
uj5u.com熱心網友回復:
將上傳的圖片 轉為image 格式 傳入第一個引數生成的圖片地址 傳入第二個引數
設定壓縮比(1到100) 傳入第三個引數
實作上傳前壓縮 質量基本無損
public static bool CompressImage(System.Drawing.Image sFile, string dFile, int flag = 90)
{
System.Drawing.Image iSource = sFile;
ImageFormat tFormat = iSource.RawFormat;
int dHeight = iSource.Height / 2;
int dWidth = iSource.Width / 2;
int sW = 0, sH = 0;
//按比例縮放
Size tem_size = new Size(iSource.Width, iSource.Height);
if (tem_size.Width > dHeight || tem_size.Width > dWidth)
{
if ((tem_size.Width * dHeight) > (tem_size.Width * dWidth))
{
sW = dWidth;
sH = (dWidth * tem_size.Height) / tem_size.Width;
}
else
{
sH = dHeight;
sW = (tem_size.Width * dHeight) / tem_size.Height;
}
}
else
{
sW = tem_size.Width;
sH = tem_size.Height;
}
Bitmap ob = new Bitmap(dWidth, dHeight);
Graphics g = Graphics.FromImage(ob);
g.Clear(Color.WhiteSmoke);
g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
g.DrawImage(iSource, new Rectangle((dWidth - sW) / 2, (dHeight - sH) / 2, sW, sH), 0, 0, iSource.Width, iSource.Height, GraphicsUnit.Pixel);
g.Dispose();
//以下代碼為保存圖片時,設定壓縮質量
EncoderParameters ep = new EncoderParameters();
long[] qy = new long[1];
qy[0] = flag;//設定壓縮的比例1-100
EncoderParameter eParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, qy);
ep.Param[0] = eParam;
try
{
ImageCodecInfo[] arrayICI = ImageCodecInfo.GetImageEncoders();
ImageCodecInfo jpegICIinfo = null;
for (int x = 0; x < arrayICI.Length; x++)
{
if (arrayICI[x].FormatDescription.Equals("JPEG"))
{
jpegICIinfo = arrayICI[x];
break;
}
}
if (jpegICIinfo != null)
{
ob.Save(dFile, jpegICIinfo, ep);//dFile是壓縮后的新路徑
FileInfo fi = new FileInfo(dFile);
}
else
{
ob.Save(dFile, tFormat);
}
return true;
}
catch
{
return false;
}
finally
{
iSource.Dispose();
ob.Dispose();
}
}
uj5u.com熱心網友回復:
https://gitee.com/bibaoke/Less.Image 我寫的圖片裁剪專案。uj5u.com熱心網友回復:
??我想說http本來就支持gziphttps://blog.csdn.net/cyydqc/article/details/44464353
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/152475.html
標籤:ASP.NET
