Распараллеливание GDI + Изменение размера изображения .net

Я попытался распараллелить изменение размера 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

1
задан mtmurdock 15 September 2010 в 16:36
поделиться