我试图使用.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