byte in ein Bild umwandeln byte in ein Bild umwandeln
Ergebnis 1 bis 9 von 9
  1. Hallo Zusammen

    Ich versuche mich gerade etwas mit einer neuen App. Hier möchte ich ein Bild in meine Datenbank speichern. Dafür habe ich mir eine Spalte vom Typ byte[] angelegt.

    Das Bild hole ich über den CameraCaptureTask und wandle es anschliessend mit folgendem Code in Byte um:

    Code:
            public static byte[] ConvertToBytes(Stream imageStream)
            {
                BinaryReader binary = new BinaryReader(imageStream);
    
    
                byte[] imgByteArray = binary.ReadBytes((int)(imageStream.Length));
    
    
                binary.Close();
                binary.Dispose();
                return imgByteArray;
            }
    Das scheint noch zu funktionieren.

    Jedoch möchte ich nun über folgende Funktionen die Daten von byte wieder in eine Bild umwandeln und einem Image Controll zuweisen:

    Code:
            private void image_Loaded(object sender, System.Windows.RoutedEventArgs e)
            {
                image.Source = Utilities.ConvertToImage(imageByte);
            }
    
    
            public static WriteableBitmap ConvertToImage(byte[] inputBytes)
            {
                MemoryStream ms = new MemoryStream(inputBytes);
                WriteableBitmap img = new WriteableBitmap(400, 400);
    
    
                img.LoadJpeg(ms);
    
    
                return (img);
            }
    Bei return(img); wird mir folgende Fehlermeldung geworfen:

    Code:
    {System.Runtime.InteropServices.COMException (0x88982F50): The component cannot be found. (Exception from HRESULT: 0x88982F50)
       at Microsoft.Devices.PhotosZuneNativeMethods.MediaApi_DecodeJpegStreamIntoARGB(ReaderCallbackSig pfnRead, SeekCallbackSig pfnSeek, UInt64 lengthOfStream, UInt32 bufferSize, Int32[] pixelBuffer, UInt32 pixelWidth, UInt32 pixelHeight)
       at Microsoft.Devices.StreamHelper.DecodeJpegStreamIntoARGB()
       at System.Windows.Media.Imaging.Extensions.LoadJpeg(WriteableBitmap bitmap, Stream sourceStream)
       at MyMedi.Src.Utilities.ConvertToImage(Byte[] inputBytes)
       at MyMedi.Views.MedicineDetails.medicineImage_Loaded(Object sender, RoutedEventArgs e)
       at MS.Internal.CoreInvokeHandler.InvokeEventHandler(Int32 typeIndex, Delegate handlerDelegate, Object sender, Object args)
       at MS.Internal.JoltHelper.FireEvent(IntPtr unmanagedObj, IntPtr unmanagedObjArgs, Int32 argsTypeIndex, Int32 actualArgsTypeIndex, String eventName)}
    Leider habe ich im Internet bisher nichts hierzu gefunden was mir weiterhilft. Hat jemand von euch eine Idee?

    Danke im vornherein.

    Gruss
    Nemoc
    0
     

  2. 12.06.2013, 22:32
    #2
    Also ich würde das folgendermaßen machen:

    1.) Ein WritableBitmap aus dem Image erstellen.
    2.) SaveJpeg nutzen um die WritableBitmap in einen MemoryStream zu schreiben
    3.) Den Buffer des MemoryStream wegspeichern (das ist nämlich ein Byte-Array)

    Allerdings würde ich tendenziell das Bild gar nicht direkt in die Datenbank speichern, nachdem du ja nach der Spalte sowieso nicht abfragen wirst (also so ala SELECT * FROM table WHERE Bild like '%00001111%') würde ich wohl mit Guid.NewGuid() einen unique Name generieren und das Bild im IsolatedStorage in einem Unterordner ablegen, mit der Guid als Name (z.B. /DbImages/abc0-63245.jpg). Den Pfad zum Bild speicherst du dann in die Datenbank. Beim Laden wird dann einfach ein FileStream genutzt oder eben eine für die Source (ermöglicht dann auch Lazy Loading, wenn das Bild z.B. in nem LongListSelector außerhalb des dargestellten Bereichs ist).

    PS: Was mir bei deinem Code oben jetzt auch noch auffällt: springst du im imageStream wieder zurück zum Anfang bevor du ihn ausliest? Sonst liest du vom Ende des Streams und da ist das Bild halt eben nicht drinnen. Wenn der imageStream ein MemoryStream ist geht das z.B. indem du imageStream.Position = 0; vorher ausführst.
    2
     

  3. Danke für deine Antwort.

    Sinn und Zweck davon es in die Datenbank zu packen war die Idee alles an einem Ort zu haben. Entsprechend ist es dann zum sichern auch etwas angenehmer, da einfach eine Sicherung der Datenbank gemacht werden kann und sich nicht noch extra um die Bilder gekümmert werden muss.

    Das Problem lag wirklich daran wie es gespeichert wurde. Über folgenden Code hat es nun geklappt:

    speichern
    Code:
            public static byte[] ConvertToBytes(Stream imageStream)
            {
                MemoryStream ms = new MemoryStream();
                WriteableBitmap bmp = new WriteableBitmap(1500, 1500);
    
                bmp.LoadJpeg(imageStream);
                bmp.SaveJpeg(ms, 1500, 1500, 0, 100);            
    
                return ms.GetBuffer();
            }
    und wieder auslesen

    Code:
            public static WriteableBitmap ConvertToImage(byte[] inputBytes)
            {
                WriteableBitmap img = new WriteableBitmap(800, 800);
    
                var ms = new MemoryStream(inputBytes);
                img.LoadJpeg(ms);           
    
                return img;
            }
    Danke vielmals =)
    1
     

  4. 13.06.2013, 09:15
    #4
    Wart mal - in imageStream hast du schon ein JPEG-komprimiertes Bild? Dann würde ich statt LoadJpeg und dann nochmal SaveJpeg einfach den imageStream auslesen und in den MemoryStream schreiben. Ist dann ne direkte Kopie und benötigt keine weiteren Berechnungen => schneller.

    Ist wohl noch immer nicht optimal - was ist denn der ImageStream genau für ein Stream? Am besten würde man ja den schon als MemoryStream umsetzen und so dann den Buffer auslesen.
    0
     

  5. Ja scheint noch etwas doppelt gemoppelt zu sein.
    Der Image Stream ist das Ergebnis aus dem e.choosenPhoto vom CameraCaptureTask.

    Nur den ImageStream auszulesen habe ich am Anfang versucht (siehe mein erster Post). Das hat jedoch leider nicht so wirklich geklappt.
    0
     

  6. 13.06.2013, 09:56
    #6
    imageStream.CopyTo(memoryStream);

    Hab auf dem PC wo ich grad bin nur das große .Net Framework - aber das Interface von Stream müsste gleich sein.
    0
     

  7. Von der Syntax her funktioniert das, jedoch erhalte ich jetzt wieder den Fehler von vorhin.

    The component cannot be found. (Exception from HRESULT: 0x88982F50)
    0
     

  8. 13.06.2013, 14:01
    #8
    Hmm... merkwürdig...
    0
     

  9. Ich hab das ganze jetzt dahingehend optimiert dass ich direkt im event Handler des Camera Capture Task das WriteableBitmap erstelle, dass dann im Image Control anzeige und anschliessend zum umwandeln in Byte an die Funktion übergebe. Somit muss ich es nicht nochmals extra in ein Writeable umwandeln nur zum speichern, was das Ganze auch schon ein Stück beschleunigt hat.

    Wieso diese Fehlermeldung geworfen wird, ist aber trotzdem seltsam.

    Danke auf jeden Fall für deine Hilfe.
    0
     

Ähnliche Themen

  1. filmdatei MNV von Sony in eine andere umwandeln
    Von werjut im Forum Sony Tablet S
    Antworten: 2
    Letzter Beitrag: 20.09.2013, 15:37
  2. Bereits installierte apps in eine zip datei umwandeln um diese zu flashen?
    Von BlackDragonx21 im Forum HTC Desire Root und ROM
    Antworten: 3
    Letzter Beitrag: 07.11.2011, 11:38
  3. Wie erstelle ich ein Bild für den "Heute" Bildschi
    Von mbeuggert im Forum Plauderecke
    Antworten: 1
    Letzter Beitrag: 19.05.2006, 12:30
  4. SDA T-mobile Branding in Orange Branding umwandeln...
    Von raefu im Forum Forum Andere Hersteller (SP)
    Antworten: 9
    Letzter Beitrag: 25.09.2005, 17:39
  5. Umwandlung vin PC in Handheld in eine Datenbank (Exel in dbf
    Von urs.schoenenberg im Forum Plauderecke
    Antworten: 1
    Letzter Beitrag: 05.09.2005, 10:08

Besucher haben diese Seite mit folgenden Suchbegriffen gefunden:

byte umwandeln

JPEG umwandeln

phone 8 byte[] to bitmapimage

wp8 0x88982F50

mymedi