Я попытался распараллелить изменение размера jpeg с помощью .Net. Все мои попытки потерпели неудачу, потому что Graphics.DrawImage-func, похоже, блокируется во время активности. Попробуйте выполнить следующее:
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 с несколькими потоками? В реальном приложении размер нескольких изображений следует изменять одновременно (на четырехъядерном ПК), а не всегда одинаково. Однако я столкнулся с небольшой загвоздкой. Макет действия определяет фон ...
Я работаю с ListActivity, и я пытаюсь добавить изображения / фоны, чтобы все выглядело красиво. Однако я столкнулся с небольшой загвоздкой.
Макет действия определяет фоновое изображение, но элементы списка не всегда прозрачны и, следовательно, закрывают фон. Если я прокручиваю или иным образом касаюсь элемента списка, фон элемента списка будет прозрачным (по желанию), но если я коснусь чего-либо еще, они получат черный фон, который закроет фон действия.
Есть ли какое-то значение, которое я могу установить как, android: background = "invisible" или что-то еще, чтобы исправить эту проблему?
TIA