?
Solved

VB.NET Picture into class variable looses file information

Posted on 2012-12-26
8
Medium Priority
?
256 Views
Last Modified: 2012-12-28
Hi,

I'm having a problem with file information being lost, and am getting Parameter is not valid when trying to get any of the picture attibutes, after having loaded the picture from file into a variable.  When initially adding the picture into a new class, the file info is there until the New constructor has finished.  Please see the below pictures

 
 
 Loading Image from fileImage gets loaded ok Within the class still ok from new constructoronce outside looses file information
0
Comment
Question by:prototye
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 2
  • 2
  • 2
  • +2
8 Comments
 
LVL 2

Expert Comment

by:corvetteguru
ID: 38721782
try passing the values out of the function...

Your function is set as PRIVATE FUNCTION .... as Boolean

Well, the Boolean isn't going to hold the data you need, you need to return the image data.

Private Function .... as ImageData

And looking at your screen shots has me confused... I feel there were some changes made or we are not looking at the same code all the way through.

The file read function can't be boolean and pass the result you need. You need much more than a satisfactory reply with this, and if the imagedata comes back null, you know something failed.
0
 
LVL 75

Expert Comment

by:käµfm³d 👽
ID: 38721870
Please post the entire relevant code. It is difficult to see the big picture from a few select screenshots  : \
0
 
LVL 86

Expert Comment

by:Mike Tomlinson
ID: 38721871
Post more complete code, not screenshots.
0
What does it mean to be "Always On"?

Is your cloud always on? With an Always On cloud you won't have to worry about downtime for maintenance or software application code updates, ensuring that your bottom line isn't affected.

 
LVL 83

Expert Comment

by:CodeCruiser
ID: 38721978
From MSDN

Remarks
You must keep the stream open for the lifetime of the Image.


http://msdn.microsoft.com/en-us/library/93z9ee4x.aspx

So problem seems to be that you are closing the image stream which you should not.
0
 

Author Comment

by:prototye
ID: 38723065
Please find the code below, with various methods I thried to implement commented out.  The reason I close the stream is that I don't want any lock on the file.  Should that be a problem if I use the New Bitmap (Filepath) sytnax?  Why would the image properties still be ok after I closed the memory stream before I left the class (using the  New(pFilePath As String, pPropertyCode As String, pSortOrder As Long) constuctor)

Imports System.ComponentModel
Imports System.Data.SqlClient
Imports System.Data
Imports System.IO
Imports System.Drawing.Imaging

Public Class PropertyImage
#Region "Private Members"
    Private mPropertyImageID As Long
    Private mPropertyCode As String = ""
    Private mImagePath As String = ""
    Private mSortOrder As Long
    Private mActive As Boolean
    Private mImageData As Bitmap
    Private mImageSmall1 As Bitmap
    Private Const SizeSetting1 As Long = 150
#End Region
#Region "Properties"
    <DataObjectFieldAttribute(True, True, False)> _
    Public Property PropertyImageID As Long
        Get
            Return mPropertyImageID
        End Get
        Set(value As Long)
            mPropertyImageID = value
        End Set
    End Property
    Public Property PropertyCode As String
        Get
            Return mPropertyCode
        End Get
        Set(ByVal value As String)
            mPropertyCode = value
        End Set
    End Property
    Public Property ImagePath As String
        Get
            Return mImagePath
        End Get
        Set(ByVal value As String)
            mImagePath = value
        End Set
    End Property
    Public Property ImageData As Bitmap
        Get
            'If mImageData Is Nothing And ImagePath.Length > 0 Then
            '    LoadExisting()
            'End If
            Return mImageData
        End Get
        Set(value As Bitmap)
            mImageData = value
        End Set
    End Property
    Public Property ImageSmall1 As Bitmap
        Get
            If mImageSmall1 Is Nothing Then
                LoadSmall1()
            End If
            Return mImageSmall1
        End Get
        Set(value As Bitmap)
            mImageSmall1 = value
        End Set
    End Property
    Public Property SortOrder As Long
        Get
            Return mSortOrder
        End Get
        Set(value As Long)
            mSortOrder = value
        End Set
    End Property
    Public Property Active As Boolean
        Get
            Return mActive
        End Get
        Set(value As Boolean)
            mActive = value
        End Set
    End Property
#End Region
#Region "Constuctors"
    Public Sub New()
    End Sub
    Public Sub New(pFilePath As String, pPropertyCode As String, pSortOrder As Long)
        If LoadNewFromFile(pFilePath) Then
            PropertyCode = pPropertyCode
            SortOrder = pSortOrder
            Active = True
        End If
    End Sub
    Public Sub New(ByRef objReader As SqlDataReader)
        LoadFromReader(objReader)
    End Sub
#End Region
#Region "Image File IO"
    Private Function LoadNewFromFile(pFilePath As String) As Boolean
        Try
            If File.Exists(pFilePath) = False Then Return False
            'Dim limageStream As MemoryStream = New MemoryStream(
            Dim ImageStream As New FileStream(pFilePath, FileMode.Open, FileAccess.Read)
            'ImageData = ResizeImage(ImageStream, 0)
            ImageData = Image.FromStream(ImageStream)
            ImageStream.Close()

            'Dim img As Image = Image.FromFile(pFilePath)

            'Dim lImage As New Bitmap(ImageStream)
            'ImageData = GetNewImage(lImage)
            'ImageStream.Close()
            ''ImageStream.Dispose()
            'lImage = Nothing
            Return True
        Catch ex As Exception
            MsgBox(ex.ToString)
            Return False
        End Try
    End Function
    Private Function LoadExisting() As Boolean
        If File.Exists(ImagePath) = False Then Return False
        Dim lImage As New Bitmap(ImagePath)
        ImageData = GetNewImage(lImage)
        lImage = Nothing
        Return True
    End Function
    Private Function LoadSmall1() As Boolean
        If ImageData Is Nothing Then Return False
        ImageSmall1 = GetNewImage(ImageData, 1)
        Return True
    End Function
    Public Function SaveToFile(strFileName)
        ImageData.Save(strFileName)
        Return True
    End Function
#End Region
#Region "Image Resizing and Manipulation"
    Private Function GetNewImage(ByVal originalImage As Bitmap, Optional ByVal SizeSetting As Long = 0) As Bitmap
        Dim newImage As Bitmap
        If ImageNeedsResizing(originalImage.Width, originalImage.Height, SizeSetting) Then
            newImage = ResizeImage(originalImage, SizeSetting)
        Else
            newImage = New Bitmap(originalImage, originalImage.Width, originalImage.Height)
        End If
        originalImage.Dispose()
        Return newImage
    End Function
    Public Overloads Function ResizeImage(ByVal pImage As Bitmap, SizeSetting As Long) As Bitmap
        Dim newImage As New Bitmap(pImage, NewWidth(pImage.Width, pImage.Height, SizeSetting), NewHeight(pImage.Width, pImage.Height, SizeSetting))
        Dim g As Graphics = Graphics.FromImage(newImage)
        g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBilinear
        g.DrawImage(pImage, 0, 0, newImage.Width, newImage.Height)
        pImage.Dispose()
        Return newImage
    End Function
    Public Overloads Function ResizeImage(ByVal streamImage As Stream, SizeSetting As Long) As Bitmap
        Dim pImage As Bitmap
        pImage = Image.FromStream(streamImage)
        Dim newImage As New Bitmap(pImage, NewWidth(pImage.Width, pImage.Height, SizeSetting), NewHeight(pImage.Width, pImage.Height, SizeSetting))
        Dim g As Graphics = Graphics.FromImage(newImage)
        g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBilinear
        g.DrawImage(pImage, 0, 0, newImage.Width, newImage.Height)
        pImage.Dispose()
        Return newImage
    End Function

    Private Function NewWidth(OrginalWidth As Int32, OriginalHeight As Int32, SizeSetting As Long) As Int32
        Dim lMaxSize1 As Integer = 1024, lMaxSize2 As Integer = 768
        If SizeSetting = 1 Then
            lMaxSize1 = SizeSetting1
            lMaxSize2 = SizeSetting1
        End If
        Dim divideBy, divideByH, divideByW As Double

        divideByW = OrginalWidth / lMaxSize1
        divideByH = OriginalHeight / lMaxSize1

        If divideByW > divideByH Then
            divideBy = divideByW
            If (OriginalHeight / divideBy) > lMaxSize2 Then
                divideBy = OriginalHeight / lMaxSize2
            End If
        Else
            divideBy = divideByH
            If (OrginalWidth / divideBy) > lMaxSize2 Then
                divideBy = OrginalWidth / lMaxSize2
            End If
        End If
        If divideBy <= 1 Then Return OrginalWidth
        Return OrginalWidth / divideBy

    End Function
    Private Function NewHeight(OrginalWidth As Int32, OriginalHeight As Int32, SizeSetting As Long) As Int32
        Dim lMaxSize1 As Integer = 1024, lMaxSize2 As Integer = 768
        If SizeSetting = 1 Then
            lMaxSize1 = SizeSetting1
            lMaxSize2 = SizeSetting1
        End If
        Dim divideBy, divideByH, divideByW As Double

        divideByW = OrginalWidth / lMaxSize1
        divideByH = OriginalHeight / lMaxSize1

        If divideByW > divideByH Then
            divideBy = divideByW
            If (OriginalHeight / divideBy) > lMaxSize2 Then
                divideBy = OriginalHeight / lMaxSize2
            End If
        Else
            divideBy = divideByH
            If (OrginalWidth / divideBy) > lMaxSize2 Then
                divideBy = OrginalWidth / lMaxSize2
            End If
        End If
        If divideBy <= 1 Then Return OriginalHeight

        Return OriginalHeight / divideBy

    End Function
    Private Function ImageNeedsResizing(OrginalWidth As Int32, OriginalHeight As Int32, SizeSetting As Long) As Boolean
        If OriginalHeight = NewHeight(OrginalWidth, OriginalHeight, SizeSetting) And OrginalWidth = NewWidth(OrginalWidth, OriginalHeight, SizeSetting) Then Return False
        Return True
    End Function
#End Region
#Region "DB Operations"
    Private Function LoadFromReader(ByRef objReader As SqlDataReader) As Boolean
        Try
            PropertyImageID = objReader(objReader.GetOrdinal("PropertyImageID"))
            PropertyCode = objReader(objReader.GetOrdinal("PropertyCode"))
            Active = objReader(objReader.GetOrdinal("Active"))
            SortOrder = objReader(objReader.GetOrdinal("SortOrder"))

            Return True
        Catch ex As Exception
            gHandleError.ERROR_LOG(System.Reflection.MethodBase.GetCurrentMethod.Name(), gCurrentStack.GetFrame(1).GetMethod.Name, System.Reflection.MethodBase.GetCurrentMethod.Module.Name, ex.Message, Application.ProductName)
            Return False
        End Try
        Return True
    End Function
#End Region
End Class

Open in new window

0
 
LVL 83

Expert Comment

by:CodeCruiser
ID: 38723356
For testing, what happens if you don't close the stream?
0
 

Author Comment

by:prototye
ID: 38723578
I tried that, but it still failed.  I can't believe I've spent so much time trying to deal with images.  Now looking at saving them in a DB, just to get around this problem :)
0
 
LVL 86

Accepted Solution

by:
Mike Tomlinson earned 1500 total points
ID: 38725016
Hmm...I think the problem stems from your GetNewImage() function when it gets called by your LoadSmall1() function as a result of accessing the ImageSmall1() property.

Your ImageSmall1() Property:
    Public Property ImageSmall1 As Bitmap
        Get
            If mImageSmall1 Is Nothing Then
                LoadSmall1()
            End If
            Return mImageSmall1
        End Get
        Set(value As Bitmap)
            mImageSmall1 = value
        End Set
    End Property

Open in new window


...calls the LoadSmall1() function:
    Private Function LoadSmall1() As Boolean
        If ImageData Is Nothing Then Return False
        ImageSmall1 = GetNewImage(ImageData, 1)
        Return True
    End Function

Open in new window


...which passes "ImageData" to GetNewImage():
    Private Function GetNewImage(ByVal originalImage As Bitmap, Optional ByVal SizeSetting As Long = 0) As Bitmap
        Dim newImage As Bitmap
        If ImageNeedsResizing(originalImage.Width, originalImage.Height, SizeSetting) Then
            newImage = ResizeImage(originalImage, SizeSetting)
        Else
            newImage = New Bitmap(originalImage, originalImage.Width, originalImage.Height)
        End If
        originalImage.Dispose()
        Return newImage
    End Function

Open in new window


At line #8, you are Disposing "originalImage" which points to your main bitmap data.  This is where your data is getting lost at!
0

Featured Post

Microsoft Certification Exam 74-409

Veeam® is happy to provide the Microsoft community with a study guide prepared by MVP and MCT, Orin Thomas. This guide will take you through each of the exam objectives, helping you to prepare for and pass the examination.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

The ECB site provides FX rates for major currencies since its inception in 1999 in the form of an XML feed. The files have the following format (reducted for brevity) (CODE) There are three files available HERE (http://www.ecb.europa.eu/stats/exch…
Calculating holidays and working days is a function that is often needed yet it is not one found within the Framework. This article presents one approach to building a working-day calculator for use in .NET.
Michael from AdRem Software explains how to view the most utilized and worst performing nodes in your network, by accessing the Top Charts view in NetCrunch network monitor (https://www.adremsoft.com/). Top Charts is a view in which you can set seve…
Visualize your data even better in Access queries. Given a date and a value, this lesson shows how to compare that value with the previous value, calculate the difference, and display a circle if the value is the same, an up triangle if it increased…
Suggested Courses

752 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question