Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Memory stream help needed

Îåêßíçóå áðü ôï ìÝëïò bull. Τελευταία δημοσίευση από το μέλος bull στις 24-05-2012, 17:25. Υπάρχουν 8 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  22-05-2012, 16:52 70357

    Memory stream help needed

    Ο στόχος: να διαβάσω από ένα SQL table (η βάση είναι από Microsoft Dynamics NAV 2009 SP1 ERP) τον κωδικό του είδους και την εικόνα του και να το αποθηκεύσω ως jpg στον σκληρό δίσκο με το όνομα του κωδικού του είδους.
    Το πρόβλημα: όταν κάνω ανάθεση στην μεταβλητή τύπου image το MemoryStream παίρνω πίσω "parameter is not valid".
    Η προσπάθεια επίλυσης: έφτιαξα ένα δικό μου νέο πίνακα με τα ίδια field types και ανέβασα data ίδια με αυτά που είναι στο ERP table, και η ίδια ρουτίνα δουλεύει κανονικά και κάνει save το αρχείο στο δίσκο.

    Μήπως έχει να κάνει με τον τρόπο που το αποθηκεύει το NAV κατα την εισαγωγή του από τον χρήστη, και το κάνει "unusable" ως image;

    Ιδού η απλή ρουτίνα:

           Using conn As New SqlConnection("integrated Security=SSPI;Persist Security Info=False;Initial Catalog=myDB;Data Source=myServer")
                Dim sql As String = " SELECT TOP 10 No_, Picture FROM myTable WHERE DATALENGTH([Picture]) <> 0 "
                Dim cmd As New SqlCommand(sql, conn)
                conn.Open()
    
                Dim dr As SqlDataReader = cmd.ExecuteReader()
                While dr.Read()
                    Dim bytes As Byte() = DirectCast(dr("Picture"), Byte())
                    Dim memStream As New MemoryStream(bytes)
    
                    Try
                        Dim MyImage As Image = Image.FromStream(memStream)
                        MyImage = New Bitmap(MyImage, 200, 250)
                        MyImage.Save("d:\" + dr("No_") + ".jpg", ImageFormat.Jpeg)
                    Catch ex As Exception
                        MsgBox(ex.Message)
                    End Try
    
                End While
            End Using
    
    
    
    Υπάρχει άλλος τρόπος εκτός από το MemoryStream;

    Οποιαδήποτε βοήθεια θα την εκτιμούσα! :)

    VI
  •  23-05-2012, 17:03 70366 σε απάντηση της 70357

    Απ: Memory stream help needed

    Εν συντομία, προσπαθείς να φορτώσεις μία εικόνα από ένα byte array και η Image.FromStream σου λέει ότι τα δεδομένα έχουν πρόβλημα. Απ' ότι καταλαβαίνω μάλλον δεν είσαι σίγουρος σε τί μορφή είναι τα δεδομένα. Αν δεν το ξέρεις αυτό όμως, δεν μπορείς να κάνεις καμμία μετατροπή και δεν σου φταίει το Image ή το MemoryStream. Θα πρότεινα να σώσεις τα δεδομένα πρώτα στο σκληρό για να δείς τί μορφής είναι και μετά να προσπαθήσεις να τα φορτώσεις στο Image.

    Άλλο πιθανό θέμα μπορεί να είναι ότι πχ. το συγκεκριμένο πεδίο δεν περιέχει εικόνα αλλά κάτι άλλο. Τί μέγεθος έχει το buffer που φορτώνεις?

    Μία πιθανότητα είναι τα δεδομένα να μην είναι καν εικόνα αλλά OLE Object, κάτι το οποίο εμφανίζεται που και που σε βάσεις Access. Αντί για την εικόνα την ίδια, αποθηκεύεται ένα αντικείμενο το οποίο περιέχει δεδομένα εικόνας. Αυτή η τεχνική χρησιμοποιείται στο Office για να ενσωματωθούν εικόνες, video, ήχος κλπ μέσα σε documents. Μπορείς να βρεις τέτοια δεδομένα σε παλιές εφαρμογές με Access

    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  23-05-2012, 20:10 70369 σε απάντηση της 70366

    Απ: Memory stream help needed

    Ρε φίλε Πάνο, ξέρω ότι τα δεδομένα που ανεβάζει ο χρήστης είναι .bmp αρχεία. Αυτό που αναρωτιέμαι είναι αν αλλάζει/αλλοιώνεται ο τύπος κατά την εισαγωγή του στην βάση, πχ. στο header κατά την αποθήκευση του στον πίνακα.
    Οπότε αυτό που ίσως βοηθούσε είναι μια κλήση που να δείξει τι mime type έχει μέσα το memory stream όταν το κατεβάζω από την βάση ή να βρω το signature στο header και να αναγνωρίσω τέλος πάντων κάπως τι είναι αυτό που διαβάζω αν δεν είναι .bmp

    Βρήκα ότι το OLE object ενός BMP έχει standard signature 0x424D και είναι fixed length 78. Θα δουλέψω λίγο πάνω σ'αυτό και θα δούμε τι θα πάρω... ελπίζω όχι τα γνωστά :)

    Το ίδιο αρχείο που ανεβάζει ο χρήστης αν το ανεβάσω εγώ με δικό μου πρόγραμμα μπορώ να το διαβάσω κανονικά. Άρα κάτι αλλάζει κατά την αποθήκευση του στην βάση του NAV.... λέω εγώ τώρα...

    Το length της μεταβλήτης bytes τύπου Byte() είναι 10877 αν αυτό απαντάει στην ερώτηση σου.

    Σε ευχαριστώ πάντως καθώς με έκανες να το δω από άλλη οπτική γωνία.

    Θα επανέλθω...
    VI
  •  23-05-2012, 20:50 70371 σε απάντηση της 70369

    Απ: Memory stream help needed

    Αν όντως είναι OLE το αντικείμενο που διαβάζεις τότε ίσως σου φανεί χρήσιμο αυτό το άθρο: http://blogs.msdn.com/b/pranab/archive/2008/07/15/removing-ole-header-from-images-stored-in-ms-access-db-as-ole-object.aspx.

    Τάσος Καραγιάννης

    Baby debugging steps...
  •  24-05-2012, 15:02 70377 σε απάντηση της 70371

    Απ: Memory stream help needed

    Ευχαριστώ, Τάσο.
    Θα το δω και θα ενημερώσω...
    VI
  •  24-05-2012, 16:04 70378 σε απάντηση της 70377

    Απ: Memory stream help needed

    Ψάχνοντας διαπίστωσα ότι οι εικόνες αποθηκεύονται στο Navision συμπιεσμένες, και για να τις διαβάσεις κανείς πρέπει να απενεργοποιήσει τη συμπίεση. Για να γίνει αυτό θα πρέπει να έχει κανείς developer license. 
    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  24-05-2012, 16:46 70379 σε απάντηση της 70378

    Απ: Memory stream help needed

    Δεν μπορεί να είσαι τόσο καλός;!! :D
    Μπορώ μήπως να έχω το link να σκίσω τον προμηθευτή μου που το παίζει "κυρία";
    VI
  •  24-05-2012, 17:14 70380 σε απάντηση της 70379

    Απ: Memory stream help needed

    Το είδα στο  http://www.mibuso.com/forum/viewtopic.php?f=23&t=35160

    Ψάχνοντας λίγο παραπάνω για "Navision image compression" βρήκα το BLOB fields with NAV & SQL που προτείνει να βγάλεις τις εικόνες σε ένα άλλο πίνακα με στήλες ... [Νο_] και [Picture] , και πως να κάνεις το export από το ίδιο το Navision, εδώ λέει πως να κλείσεις το compression

    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  24-05-2012, 17:25 70381 σε απάντηση της 70380

    Απ: Memory stream help needed

    Respect! ;) Ευχαριστώ φίλε για τον χρόνο που διέθεσες... χρωστάω μπύρα!
    VI
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems