Изменение размера и сохранение изображений WPF работает на большинстве изображений, но не позволяет изменить размер или сохранить на других

Я пытаюсь изменить размер и сохранить 3 изображения, как определено в событии Page_load.

В методеResizeAndSave У меня есть 2 метода, которые я пытаюсь:FastResize а такжеSlowResize.

Когда я раскомментируюFastResize Строка кода: ИЗОБРАЖЕНИЕ 1 и 2 сохранены и правильно изменены. ИЗОБРАЖЕНИЕ 3, однако, сохраняется в размерах 625x441px и поэтому не относится к блоку 200x200, размер которого я хочу изменить.

Когда я вместо этого используюSlowResize Строка кода: ИЗОБРАЖЕНИЕ 1 и 2 снова сохраняются и корректно изменяют размер. ФОТО 3, однако, не сохраняется вообще.

В моем коде нет ошибок. Я буду импортировать изображения из различных источников, поэтому очень важно, чтобы мой код работал с широким спектром графических форматов. И, видимо, в IMAGE 3 есть что-то особенное, и я не знаю, что это такое и как с этим справиться.

Вот мой полный код, вы должны просто скопировать / вставить его и протестировать для себя:

Imports System.Drawing
Imports System.Drawing.Imaging
Imports System.IO
Imports System.Xml
Imports System.Data.SqlClient
Imports System.Net
Imports System.Windows.Media.Imaging
Imports System.Windows.Media

Partial Class importfeeds
    Inherits System.Web.UI.Page

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    'IMAGE 1
    ResizeAndSave(200, 200, "https://upload.wikimedia.org/wikipedia/commons/8/82/Dell_Logo.png")    
    'IMAGE 2        
    ResizeAndSave(200, 200, "https://upload.wikimedia.org/wikipedia/commons/d/d8/Square-1_solved.jpg")  
    'IMAGE 3
    ResizeAndSave(200, 200, "http://cdn2.emobassets.eu/media/catalog/product/1/1/1116220.jpg")          

End Sub


Private Sub ResizeAndSave(ByVal maxWidth As Integer, ByVal maxHeight As Integer, ByVal imageURL As String)
    Dim imgRequest As WebRequest = WebRequest.Create(imageURL)
    Dim imgResponse As WebResponse = imgRequest.GetResponse()

    Dim streamPhoto As Stream = imgResponse.GetResponseStream()
    Dim memStream As New MemoryStream
    streamPhoto.CopyTo(memStream)
    memStream.Position = 0
    Dim bfPhoto As BitmapFrame = ReadBitmapFrame(memStream)

    Dim newWidth, newHeight As Integer
    Dim scaleFactor As Double

    If bfPhoto.Width > maxWidth Or bfPhoto.Height > maxHeight Then
        If bfPhoto.Width > maxWidth Then
            scaleFactor = maxWidth / bfPhoto.Width
            newWidth = Math.Round(bfPhoto.Width * scaleFactor, 0)
            newHeight = Math.Round(bfPhoto.Height * scaleFactor, 0)
        End If
        If newHeight > maxHeight Then
            scaleFactor = maxHeight / newHeight
            newWidth = Math.Round(newWidth * scaleFactor, 0)
            newHeight = Math.Round(newHeight * scaleFactor, 0)
        End If
    End If


    Dim bfResize As BitmapFrame = FastResize(bfPhoto, newWidth, newHeight)
    'Dim bfResize As BitmapFrame = SlowResize(bfPhoto, newWidth, newHeight, BitmapScalingMode.Linear)

    Dim baResize As Byte() = ToByteArray(bfResize)

    Dim strThumbnail As String = Guid.NewGuid.ToString() + ".png"
    Dim saveToPath As String = Server.MapPath(ConfigurationManager.AppSettings("products_photospath")) + "\49\" + strThumbnail

    File.WriteAllBytes(saveToPath, baResize)

End Sub

Private Shared Function FastResize(bfPhoto As BitmapFrame, nWidth As Integer, nHeight As Integer) As BitmapFrame
    Dim tbBitmap As New TransformedBitmap(bfPhoto, New ScaleTransform(nWidth / bfPhoto.PixelWidth, nHeight / bfPhoto.PixelHeight, 0, 0))
    Return BitmapFrame.Create(tbBitmap)
End Function

'http://weblogs.asp.net/bleroy/resizing-images-from-the-server-using-wpf-wic-instead-of-gdi
Public Shared Function SlowResize(photo As BitmapFrame, width As Integer, height As Integer, scalingMode As BitmapScalingMode) As BitmapFrame

    Dim group = New DrawingGroup()
    RenderOptions.SetBitmapScalingMode(group, scalingMode)
    group.Children.Add(New ImageDrawing(photo, New Windows.Rect(0, 0, width, height)))
    Dim targetVisual = New DrawingVisual()
    Dim targetContext = targetVisual.RenderOpen()
    targetContext.DrawDrawing(group)
    Dim target = New RenderTargetBitmap(width, height, 96, 96, PixelFormats.[Default])
    targetContext.Close()
    target.Render(targetVisual)
    Dim targetFrame = BitmapFrame.Create(target)
    Return targetFrame
End Function

Private Shared Function ToByteArray(bfResize As BitmapFrame) As Byte()
    Using msStream As New MemoryStream()
        Dim pbdDecoder As New PngBitmapEncoder()
        pbdDecoder.Frames.Add(bfResize)
        pbdDecoder.Save(msStream)
        Return msStream.ToArray()
    End Using
End Function

Private Shared Function ReadBitmapFrame(streamPhoto As Stream) As BitmapFrame
    Dim bdDecoder As BitmapDecoder = BitmapDecoder.Create(streamPhoto, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.None)
    Return bdDecoder.Frames(0)
End Function

End Class

ОБНОВЛЕНИЕ 1

@Hans Passant: Ваши предложения по именованию файлов и использованию pixelWidth очень полезны и помогли мне успешно выполнить этот код на 3 изображениях вPage_load событие. Я обновил свой оригинальный код.
Однако, когда я запускаю этот код как часть моего реального приложения, где я импортирую ~ 100 изображений из канала. Новый код завершается с ошибкой нехватки памяти, когда он пытается обработать IMAGE 3. Это происходит для обоихFastResize а такжеSlowResize методы. Есть ли что-то в моем коде или на изображении, о котором идет речь, что может привести к увеличению использования памяти, может быть, где-то утечка или неэффективный метод изменения размера, который я использую?

На моей машине доступно много памяти, поэтому я был бы очень удивлен, если бы в этом была проблема, хотя я вижу значительное увеличениеSystem and compressed memory (до 1,1 ГБ) задача в моем диспетчере задач Windows. И все же, такое большое использование памяти заставило бы меня поверить, что в моем коде что-то не так.

Что это может быть?

Ответы на вопрос(1)

Ваш ответ на вопрос