在做一個把照片批量復制到指定路徑的小程式,在復制的時候順便把豎的照片翻轉為正。然后發現保存的時候,Image.Save()非常慢,影響速度效率。速度連USB2.0都達不到,而且,試過用執行緒進行多個一個Image.Save(),效率還是慢。
寫了一下測驗速度,當不用旋轉,直接用 FileInfo.CopyTo 方式會很快,直接達到USB3.0速度,
這到底是IO瓶頸還是Image.Save(),這方法存在阻塞?
private void CopyPhoto(List<FileInfo> files,string directoryTarget,bool isTurn)
{
System.Drawing.Imaging.Encoder myEncoder = System.Drawing.Imaging.Encoder.Quality;
ImageCodecInfo myImageCodecInfo = GetEncoderInfo("image/jpeg");
EncoderParameters myEncoderParameters = new EncoderParameters(1);
EncoderParameter myEncoderParameter = new EncoderParameter(myEncoder, 95L);
myEncoderParameters.Param[0] = myEncoderParameter;
for (int i = 0; i < files.Count; i++)
{
// 檔案保存路徑
string tpath = System.IO.Path.Combine(directoryTarget, files[i].FullName.Substring(8));
try
{
if (isTurn)
{
FileCopyAndDealImg(files[i].FullName, tpath, myImageCodecInfo, myEncoderParameters);
}
else
{
files[i].CopyTo(tpath, true);
}
}
catch
{
}
}
}
private void FileCopyAndDealImg(string filepath, string savepath, ImageCodecInfo myImageCodecInfo, EncoderParameters myEncoderParameters)
{
using (System.Drawing.Image _thisImage = System.Drawing.Image.FromFile(filepath))
{
// 處理圖片,現在是屏蔽了還是慢
//try
//{
// _thisImage.RemovePropertyItem(274);
//}
//catch { }
//try
//{
// _thisImage.RemovePropertyItem(20507);
//}
//catch { }
//try
//{
// _thisImage.RemovePropertyItem(20521);
//}
//catch { }
_thisImage.RotateFlip(RotateFlipType.Rotate180FlipNone);
_thisImage.Save(savepath, myImageCodecInfo, myEncoderParameters);
_thisImage.Dispose();
}
}
public 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;
}
uj5u.com熱心網友回復:
研究了一早上的并發操作,發現,Image這個類不能并發操作,估計開多執行緒也不能優化到時間public void Run1()
{
System.Drawing.Image _serverImage = System.Drawing.Image.FromFile(textBox1.Text.Trim());
_serverImage.Save("D:\\Photo\\Parallel_test1.JPG", myImageCodecInfo, myEncoderParameters);
_serverImage.Dispose();
}
public void Run2()
{
//Thread.Sleep(2000);
System.Drawing.Image _serverImage = System.Drawing.Image.FromFile(textBox3.Text.Trim());
_serverImage.Save("D:\\Photo\\Parallel_test2.JPG", myImageCodecInfo, myEncoderParameters);
_serverImage.Dispose();
}
public void ParallelInvokeMethod()
{
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
Parallel.Invoke(Run1, Run2);
stopWatch.Stop();
MessageBox.Show("Parallel run " + stopWatch.ElapsedMilliseconds + " ms.");
stopWatch.Restart();
Run1();
Run2();
stopWatch.Stop();
MessageBox.Show("Normal run " + stopWatch.ElapsedMilliseconds + " ms.");
}
uj5u.com熱心網友回復:
發現個奇怪的問題,上面方法 Parallel.Invoke 在控制臺上可以正常并發運行uj5u.com熱心網友回復:
把這個 _thisImage.RotateFlip(RotateFlipType.Rotate180FlipNone); 注釋試一下會快嗎?看看是不是旋轉的慢的還是 _thisImage.Save(savepath, myImageCodecInfo, myEncoderParameters);慢的
uj5u.com熱心網友回復:
試過,注釋了還是一樣慢,估計就是save的問題轉載請註明出處,本文鏈接:https://www.uj5u.com/net/38160.html
標籤:C#
上一篇:如何在Winform中動態調整WEBBROWER控制元件所模擬的IE版本號
下一篇:COMException (0x80070040): 指定的網路名不再可用。COMException (0x80070001): 函式不正確。這都是啥?
