Ergebnis 1 bis 9 von 9
-
entwickelt Apps
- 12.06.2013, 21:24
- #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; }
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); }
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)}
Danke im vornherein.
Gruss
Nemoc
-
Gehöre zum Inventar
- 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.
-
entwickelt Apps
- 13.06.2013, 07:27
- #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(); }
Code:public static WriteableBitmap ConvertToImage(byte[] inputBytes) { WriteableBitmap img = new WriteableBitmap(800, 800); var ms = new MemoryStream(inputBytes); img.LoadJpeg(ms); return img; }
-
Gehöre zum Inventar
- 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.
-
entwickelt Apps
- 13.06.2013, 09:39
- #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.
-
Gehöre zum Inventar
- 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.
-
entwickelt Apps
- 13.06.2013, 10:34
- #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)
-
Gehöre zum Inventar
- 13.06.2013, 14:01
- #8
Hmm... merkwürdig...
-
entwickelt Apps
- 14.06.2013, 13:38
- #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.
Ähnliche Themen
-
filmdatei MNV von Sony in eine andere umwandeln
Von werjut im Forum Sony Tablet SAntworten: 2Letzter Beitrag: 20.09.2013, 15:37 -
Bereits installierte apps in eine zip datei umwandeln um diese zu flashen?
Von BlackDragonx21 im Forum HTC Desire Root und ROMAntworten: 3Letzter Beitrag: 07.11.2011, 11:38 -
Wie erstelle ich ein Bild für den "Heute" Bildschi
Von mbeuggert im Forum PlaudereckeAntworten: 1Letzter Beitrag: 19.05.2006, 12:30 -
SDA T-mobile Branding in Orange Branding umwandeln...
Von raefu im Forum Forum Andere Hersteller (SP)Antworten: 9Letzter Beitrag: 25.09.2005, 17:39 -
Umwandlung vin PC in Handheld in eine Datenbank (Exel in dbf
Von urs.schoenenberg im Forum PlaudereckeAntworten: 1Letzter Beitrag: 05.09.2005, 10:08
Pixel 10 Serie mit Problemen:...