[英]C# Simple Image Resize : File Size Not Shrinking
我對以下代碼有疑問。 我下面的代碼成功運行了一個目錄,並將圖片的resoultion設置為更小的尺寸。 但是,文件大小不會更改。 例如,尺寸為2400x1800且文件大小為1.5MB的圖像將縮放為800x600,但800x600圖片仍為1.5MB文件大小。 我想我可能要明確壓縮圖片,但我不確定。 有任何想法嗎?
private void Form1_Load(object sender, EventArgs e)
{
string[] files = null;
int count = 0;
files = System.IO.Directory.GetFiles(@"C:\Users\..\..\ChristmasPicsResized");
foreach (string file in files)
{
System.Drawing.Bitmap bmp = System.Drawing.Bipmap.FromFile(file);
ResizeBitmap(bmp, 807, 605).Save(
@"C:\users\..\..\TempPicHold\Pic" + count.ToString() + ".jpg");
count++;
}
}
public Bitmap ResizeBitmap(Bitmap b, int nWidth, int nHeight)
{
Bitmap result = new Bitmap(nWidth, nHeight);
using (Graphics g = Graphics.FromImage((Image)result))
g.DrawImage(b, 0, 0, nWidth, nHeight);
return result;
}
發現了問題。 感謝@yetapb顯示更清晰的代碼版本,但仍然無效。 問題的答案是我需要明確指定將圖像保存為的文件類型。 我的猜測是,因為我沒有明確指定圖像格式,所以沒有相應地處理圖像壓縮。一個Bitmap剛剛以較小的分辨率保存,並在其上打了一個“.jpg”,並且沒有相應地進行壓縮。 以下代碼現在有效。
files = System.IO.Directory.GetFiles(@"C:\PicFolder");
for (string file in files)
{
Bitmap tempBmp = new Bitmap(file);
Bitmap bmp = new Bitmap(tempBmp, 807, 605);
bmp.Save(
@"C:\NewPicFolder\Pic" + count + ".jpg",
System.Drawing.Imaging.ImageFormat.Jpeg);
count++;
}
不確定位圖,但對於其他圖像,您可以指定不同的壓縮編碼器。 這里有 MSDN詳細信息
您需要在Graphics對象上設置一些屬性以更改圖像的質量。
graphics.CompositingQuality = CompositingQuality.HighSpeed;
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
graphics.CompositingMode = CompositingMode.SourceCopy;
graphics.DrawImage(photo, 0, 0, width, height);
您還可以在保存文件時設置不同的壓縮編碼,或以不同的格式保存。
private void button4_Click(object sender, EventArgs e)
{
String[] files;
int count = 0;
files = System.IO.Directory.GetFiles(@"C:/dataset");
foreach (string file in files)
{
Bitmap tempBmp = new Bitmap(file);
Bitmap bmp = new Bitmap(tempBmp, 200, 200);
bmp.Save(
@"C:/Newdataset1/" + count + ".jpg",
System.Drawing.Imaging.ImageFormat.Jpeg);
count++;
}
}
有趣的實現細節:將圖像翻轉兩次,這將導致縮略圖被拋出,這將減小文件大小。
result.RotateFlip(System.Drawing.RotateFlipType.Rotate180FlipNone);
result.RotateFlip(System.Drawing.RotateFlipType.Rotate180FlipNone);
進行了一些更改,以下代碼按預期減少了文件大小(對我而言)。
private void Form1_Load(object sender, EventArgs e)
{
string[] files = null;
int count = 0;
files = System.IO.Directory.GetFiles(@"C:\Users\..\..\ChristmasPicsResized");
foreach (string file in files)
{
Bitmap bmp = new Bitmap( file );
new Bitmap( bmp, 807, 605 ).Save(
@"C:\users\..\..\TempPicHold\Pic" + count.ToString() + ".jpg");
count++;
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.