Image.Save () генерирует исключение GDI + для изображения, полученного из растрового изображения - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть два класса: ChartObject & GrowthChartPane.

В ChartObject есть метод GetChart (), который преобразует растровое изображение в Drawing.Image, которое возвращается.

    Public Function GetChart() As Drawing.Image
    Dim chartImage As Drawing.Image
    Dim gr As Graphics
    Dim brush As Brush = Brushes.Blue
    If m_bIsBoy Then
        brush = Brushes.Red
    End If

    Using fs As New FileStream(m_sChartImageFileName, FileMode.Open, FileAccess.Read)
        chartImage = Bitmap.FromStream(fs)
        gr = Graphics.FromImage(chartImage)
    End Using

    For Each Point As PointObject In m_lstUpperPoints
        If Not Point.IsVisible Then Continue For
        Dim x As Integer = m_objUpperHorizontalAxis.ValueToPoint(Point.HorizontalValue)
        Dim y As Integer = m_objUpperVerticalAxis.ValueToPoint(Point.VerticalValue)
        gr.FillEllipse(brush, New RectangleF(x - 4, y - 4, 8, 8))
    Next
    For Each Point As PointObject In m_lstLowerPoints
        If Not Point.IsVisible Then Continue For
        Dim x As Integer = m_objLowerHorizontalAxis.ValueToPoint(Point.HorizontalValue)
        Dim y As Integer = m_objLowerVerticalAxis.ValueToPoint(Point.VerticalValue)
        gr.FillEllipse(brush, New RectangleF(x - 4, y - 4, 8, 8))
    Next
    DrawHeaderAndTable(gr)

    Return chartImage
End Function

GrowthChartPaneво время загрузки вызывает ChartObject.GetChart () для создания экземпляра объекта Drawing.Image.При попытке сохранить изображение, возвращаемое из диаграммы роста, возникает исключение.Метод довольно большой, но вот фрагмент с конца, где исключение.

            Dim fn As String = PediatricGrowthChartsImageHandler.GetPGCImagePath(CurrentPatient.EntityID, m_iChartTypeId)
        If Not IsNothing(customDrowingChart) Then
            Dim chartImage As Drawing.Image = customDrowingChart.GetChart()
            hdnImgChartH.Value = chartImage.Height.ToString 'test
            hdnImgChartW.Value = chartImage.Width.ToString 'test
            chartImage.Save(fn, System.Drawing.Imaging.ImageFormat.Png)
            chartImage.Dispose()
            imgChart.ImageUrl = String.Format("PediatricGrowthChartsImageHandler.axd?PatientID={0}&PGCTypeID={1}&rnd={2}", CurrentPatient.EntityID, m_iChartTypeId, New Random().NextDouble().ToString())
        Else
            Chart1.SaveImage(fn, ChartImageFormat.Png)
        End If
    End If
    If Not IsNothing(DataToBeFilled) Then DataToBeFilled.dispose()

End Sub

Я подтвердил, что файл НЕ существует, но исключение все еще генерируется в Image.Save ()

Я провел некоторое исследование по этой теме, и было так много разных решений, но это вызвало у меня беспокойство по поводу открытости потока.Я читал, что поток должен быть открыт для сохранения изображения и что вы можете напрямую передавать поток в метод Save (), но мне любопытно, как происходит это взаимодействие между двумя классами.

...