我試圖使用.Net並行化jpeg的大小調整。我的所有嘗試都失敗了,因爲Graphics.DrawImage-func似乎在激活時鎖定。嘗試以下內容:並行GDI +圖像調整大小.net
Sub Main()
Dim files As String() = IO.Directory.GetFiles("D:\TEMP")
Dim imgs(25) As Image
For i As Integer = 0 To 25
imgs(i) = Image.FromFile(files(i))
Next
Console.WriteLine("Ready to proceed ")
Console.ReadLine()
pRuns = 1
For i As Integer = 0 To 25
Threading.Interlocked.Increment(pRuns)
Threading.ThreadPool.QueueUserWorkItem(New Threading.WaitCallback(AddressOf LongTerm), imgs(i))
Next
Threading.Interlocked.Decrement(pRuns)
pSema.WaitOne()
Console.WriteLine("Fin")
Console.ReadLine()
End Sub
Sub LongTerm(ByVal state As Object)
Dim newImageHeight As Integer
Dim oldImage As Image = CType(state, Image)
Dim newImage As Image
Dim graph As Graphics
Dim rect As Rectangle
Dim stream As New IO.MemoryStream
Try
newImageHeight = Convert.ToInt32(850 * oldImage.Height/oldImage.Width)
newImage = New Bitmap(850, newImageHeight, oldImage.PixelFormat)
graph = Graphics.FromImage(newImage)
rect = New Rectangle(0, 0, 850, newImageHeight)
With graph
.CompositingQuality = Drawing2D.CompositingQuality.HighQuality
.SmoothingMode = Drawing2D.SmoothingMode.HighQuality
.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic
End With
'Save image to memory stream
graph.DrawImage(oldImage, rect)
newImage.Save(stream, Imaging.ImageFormat.Jpeg)
Catch ex As Exception
Finally
If graph IsNot Nothing Then
graph.Dispose()
End If
If newImage IsNot Nothing Then
newImage.Dispose()
End If
oldImage.Dispose()
stream.Dispose()
Console.WriteLine("JobDone {0} {1}", pRuns, Threading.Thread.CurrentThread.ManagedThreadId)
Threading.Interlocked.Decrement(pRuns)
If pRuns = 0 Then
pSema.Set()
End If
End Try
End Sub
所有線程都在graph.DrawImage()中等待。有沒有使用其他函數來加速代碼性能的方法?是不可能使用Graphics.Draw與多個線程?在實際應用中,多個圖像應該同時調整大小(在四核電腦上),但並不總是相同的。張貼的代碼僅用於測試目的...
在此先感謝
編輯:更新的代碼根據意見
如果爲pSema和pRuns添加聲明,則剪切並粘貼和測試proggy的答案將更容易。 – FastAl 2010-09-22 20:58:40
我發現很多時間都花在IO上,而不是在DrawImage調用中。如果你傳遞一個流的Image構造函數,你將避免解碼器中的一些鎖定問題。 (而且速度稍快)。我在構建[imageresizing.net庫](http://imageresizing.net)時運行了一些基準測試。 – 2011-05-18 18:14:03
此外,WS2008 R2和Win7上的WIC是一個不錯的選擇,而http://imageresizing.net/支持將該代碼路徑作爲一組插件。 WPF在服務器上仍然是一個壞主意,太多未修補的內存泄漏。 – 2012-01-07 07:45:06