I dette særtema om aspekter af AI ser vi på skiftet fra sprogmodeller til AI-agenter, og hvordan virksomheder kan navigere i spændet mellem teknologisk hastighed og behovet for menneskelig kontrol.
hvis det er selve billedet skal du gemme det i et byte array som illustreret her: byte [] buffer = (byte [])ds.Tables["Table"].Rows[imageNumber]["Data"]; en måde at vise det på kan være System.IO.MemoryStream stream1 = new System.IO.MemoryStream(buffer,true); stream1.Write(buffer,0,buffer.Length); Bitmap m_bitmap = (Bitmap) Bitmap.FromStream(stream1,true); //kode til at vise bitmap i picturebox.
//Her har du fat i din reader(regner med at din reader hedder rdr) byte [] buffer = (byte [])rdr_find[11];
//Nu opretter du en stream, som læser hele indholdet af dit byte[](buffer) System.IO.MemoryStream stream1 = new System.IO.MemoryStream(buffer,true); stream1.Write(buffer,0,buffer.Length);
//Her opretter du et bitmap object, som skal bruges til dit picture box Bitmap m_bitmap = (Bitmap) Bitmap.FromStream(stream1,true);
Så ved jeg ikke lige hvad Chaos havde tænkt sig med bitmap, da jeg ikke lige kan gennemskue det, når picture bix forventer et image object.
//Her har du fat i din reader(regner med at din reader hedder rdr) byte [] buffer = (byte [])rdr_find[11];
//Nu opretter du en stream, som læser hele indholdet af dit byte[](buffer) System.IO.MemoryStream stream1 = new System.IO.MemoryStream(buffer,true); stream1.Write(buffer,0,buffer.Length);
//Her opretter du et bitmap object, som skal bruges til dit picture box Bitmap m_bitmap = (Bitmap) Bitmap.FromStream(stream1,true); //sæt image i picturebox. pictureBox1.Image = m_bitmap;
Jeg får den her fejl i min log fil, når jeg prøver at indsætte et billede med mit program. Her prøver jeg også at indsætte det som hvis det var en streng
det meget mærkeligt alle de eksempler jeg har fundet bruger min metode men jeg kan ikke få den til at virke kun hvis jeg bruger en filestream. Til at indlæse billedet med.
Det billede jeg har sat ind i databasen, har jeg gjort ved hjælp af et administrations værktøj til mysql. Så det kan være det ikke er sat rigtigt ind???
Når jeg kigger på min longblob er det et felt der hedder tekst. Og når jeg klikker der, så står stien til billedet
C:\Documents and Settings\Administrator\Dokumenter\Modtagne filer\peter.jpg
Hvis det nu blev for søgt med en normal Stream, så kan Image.FromStream() funktionen bruges, men lige nu sidder jeg og har ikke lige tid til at kigge nærmere på det.
Alex hvis du kan vente til i eftermiddag, vil jeg gerne ligge mere tid i det.
FileStream MyFileStream = new FileStream(@"C:\Documents and Settings\Administrator\Dokumenter\Modtagne filer\peter.jpg", FileMode.Open); long FileSize; FileSize = MyFileStream.Length; byte[] buffer = new byte[(int)FileSize]; MyFileStream.Read(buffer, 0, (int)MyFileStream.Length); MyFileStream.Close(); //Her har du fat i din reader(regner med at din reader hedder rdr)
//Nu opretter du en stream, som læser hele indholdet af dit byte[](buffer) System.IO.MemoryStream stream1 = new System.IO.MemoryStream(buffer); //stream1.Write(buffer,0,buffer.Length); stream1.Flush(); //Her opretter du et bitmap object, som skal bruges til dit picture box Bitmap m_bitmap = (Bitmap) Bitmap.FromStream(stream1); //m_bitmap.Save("tmp.jpg",System.Drawing.Imaging.ImageFormat.Jpeg); pictureBox1.Image = m_bitmap; stream1.Close();
jo i dette tilfælde gør jeg. Det er lavet som en test at stream. Jeg får den samme fejl som dig og jeg forstår ikke helt hvorfor. hvis du bare gemmer stien i databasen kan du nøjes med noget i denne stil. pictureBox1.Image = Image.FromFile("pathtilbilled");
Ja jeg er klar over, hvis jeg bare gemmer stien til billedet i databasen som en streg, så har jeg ikke det problem. Men billedet skal ligges i databasen. Da et andet program også skal bruge billedet, og det program ligger på en anden computer
Er du helt sikker på at du har lagt dit billede korrekt op i databasen, du sagde du havde gjort det igennem et administrations værktøj, og når du kiggede på feltet, viste den kun stien til filen.
Hvilke værktøjer bruger du? Har du ikke noget kode, som ligger dit billede op i din databae?
Men nu har jeg fået hul igennem så jeg kan uploade et billede, og vise det igen... Det kommer i næste post, hæng på drenge :)
Her er til hvordan man uploader et billede til databasen, se bort fra MSSQL objecterne, det er det samme hvis du bruger MySQL .NET provideren.
System.IO.FileStream FS = new System.IO.FileStream(@"C:\FIL.jpg", FileMode.Open); long FileSize = FS.Length;
byte[] Picture = new byte[(int)FileSize]; FS.Read(Picture, 0, (int)FileSize); FS.Close();
SqlConnection con = new SqlConnection("packet size=4096;user id=USR;data source=DB;persist security info=True;initial catalog=CATALOG;password=PASS"); SqlDataAdapter adap = new SqlDataAdapter("SELECT * FROM Pictures", con); SqlCommandBuilder cmBuilder = new SqlCommandBuilder(adap);
Her forventes at du har en tabel som hedder "Pictures"(tabel), hvor der er en "ID" kolonne, og en "Piture" kolonne.
Først så ud læser du alt data fra tabellen(Næste gang kan du bare tage den første med TOP). Så oprettes der en ny række, igennem dit dataset(ds). Når billedet er lagt ind, bliver det sendt til serveren igennem DataAdapteren(adap.Update(ds)).
SqlConnection con = new SqlConnection("packet size=4096;user id=USR;data source=DB;persist security info=True;initial catalog=CATALOG;password=PASS"); SqlDataAdapter adap = new SqlDataAdapter("SELECT * FROM Pictures", con);
MemoryStream strPicture = new MemoryStream(Picture,0, Picture.Length);
strPicture.Read(Picture, 0, Picture.Length);
pictureBox1.Image = Image.FromStream(strPicture);
Her opretter du en forbindelse til databasen, og udlæser alt i et dataset. Det kan nemt laves om til din måde, igennem din datareader. Så når det er kommet ud, bliver det bare lagt ud i en memory stream, og så kan Image.FromStream() selv finde ud af det.
det er samme kode som jeg brugte i anden form. Jeg tror måske at du og jeg fik den parameter fejl fordi vores byte array var tomt eller indeholdte tommme pladser.
//Henter et billed, og laver det om til et byte[] System.IO.FileStream FS = new System.IO.FileStream(@"C:\FIL.jpg", FileMode.Open); long FileSize = FS.Length; byte[] Picture = new byte[(int)FileSize]; FS.Read(Picture, 0, (int)FileSize); FS.Close();
//Opretter alle dine MySQL objekter MySqlConnection conn = null; MySqlDataAdapter da = null; MySqlCommand cmdSelect = null; DataSet ds = new DataSet();
conn = new MySqlConnection("CONNECTIONSTRING"); da = new MySqlDataAdapter("SELECT * FROM Pictures",conn);
MySqlCommandBuilder cmb = new MySqlCommandBuilder(da);
//Henter alt til dit dataset, og opretter en ny række, med værdien fra dit byte[] da.Fill(ds); DataRow objNewRow = ds.Tables[0].NewRow(); objNewRow["Picture"] = Picture;
ds.Tables[0].Rows.Add(objNewRow); da.Update(ds);
Det burde virke til MySQL. Her får I uploadet et billed til jeres database.
//Opretter alle dine MySQL objekter MySqlConnection conn = null; MySqlDataAdapter da = null; MySqlCommand cmdSelect = null; DataSet ds = new DataSet();
conn = new MySqlConnection("CONNECTIONSTRING"); da = new MySqlDataAdapter("SELECT * FROM Pictures",conn);
//Udlæser alt til dit dataset. da.Fill(ds);
//Tager det første billed. byte[] Picture = (byte[])ds.Tables[0].Rows[0]["Picture"];
MemoryStream strPicture = new MemoryStream(Picture,0, Picture.Length);
Det er hvad jeg har brugt, til at få det op at køre på en MSSQL idag. Det er taget fra et tidligere projekt som brugte MySQL, så det burde altså virke.
Alex: Skriv hvis det er noget som volder dig problemer.
//Laver Forbindelse til databasen MySql.Data.MySqlClient.MySqlConnection Con; Con = new MySql.Data.MySqlClient.MySqlConnection(); Con.ConnectionString = MyConnection;
jo men hvis der ikke kommer noget billede ud så er der et problem prøv evt. at tilføje this.txtBox_Rediger_Email.Text = "" + (string)rdr_find[11] + ""; for at se hvad der står i kolonnen som formodes at indeholde et billede.
Unable to cast object of type 'System.Byte[]' to type 'System.String'.
Når jeg prøver at caste det ind i en streng
Og jeg får "Parameter is not valid."
Når jeg bruger
byte[] buffer = (byte[])rdr_find[11];
System.IO.MemoryStream stream1 = new System.IO.MemoryStream(buffer, true); stream1.Write(buffer, 0, buffer.Length); //Her opretter du et bitmap object, som skal bruges til dit picture box Bitmap m_bitmap = (Bitmap)Bitmap.FromStream(stream1, true); //sæt image i picturebox. pictureBox1.Image = m_bitmap;
Hos mig, med det udleveret kode fra mig, lagt ind på en MSSQL database, og læs ud igen, kommer billedet fint frem i min PictureBox, på min windows form.
Det her er min måde: System.IO.MemoryStream stream1 = new System.IO.MemoryStream(buffer,0, buffer.Length); pictureBox1.Image = Image.FromStream(stream1);
Dette er jeres måde:
System.IO.MemoryStream stream1 = new System.IO.MemoryStream(buffer, true); stream1.Write(buffer, 0, buffer.Length);
Jeg er OVERBEVIST om at det er den måde I håndtere MemoryStream'en på. Ellers kan jeg ikke se hvad der går galt. Men mindre I ikke har et helt billede i jeres database.
Alex jeg må give fortabt lige her og nu... Kan vi tage det engang i eftermiddag/aften? Sidder på arbejde, og chefen er på nakken af mig lige nu.
Når jeg kommer hjem, og har tid til det, vil jeg se om kan få smidt en MySQL på min server, og lave en windows form som bruger MySQL .NET provideren, til at uploade, og vise billeder.
Hvordan har du tænkt dig din form skal uploade et billed, ved at brugeren vælger en fil igennem en Dialog, og så trykker upload? Så vil jeg nemlig lige strikke det sammen hvis jeg får tid :)
Har fået det til at virke lidt nu. Det har noget at gøre med, at når man åbner en openfiledialog så passer den sti man angiver ikke helt. Jeg får i hvert fald en exception fejl.
Hva betyder det @ egentligt. (@"c:\peter.jpg",
og det virker ikke med ("" + this.openfiledialog.FileName + "",
Har du dit billed åbenet et sted? Har du prøvet læse stien ud en variabel, og sørge for at din openFileDialog ikke har fat i den? Kunne jo sagtens være at filen blev låst fordi din dialog peger på den.
når min filestream linje ser sådan her ud System.IO.FileStream fs = new System.IO.FileStream(@"C:\Documents and Settings\All Users\Dokumenter\Billeder\Billedeksempler\Vinter.jpg", FileMode.Open);
bare lige for at prøve med et andet billede.
Jeg kan derimod godt bruge billedet hvis jeg flytter det ned i roden af c:, og self ændrer stien i min filestream
Det har vist noget at gøre med mellemrum... Tror du skal prøve noget med [] eller ' '... Smutter hjem nu, kigger lige på noget hvis tiden bliver til det.. Glæder mig du kan uploade :-)
Der er ikke noget mellemrum, det er bare eksperten der ikke kan vise det hele. Strengen står i en lang køre. Ja det er jeg også, det har satme været bøvlet indtil videre
Jeg har desværre slet ikke haft noget tid til overs idag, og har desværre ikke tid før søndag til at hjælpe dig. :( Hvis søndag kan redde din dag, vil jeg gerne bytte MSN/ICQ adresser med dig, og så kan vi tage det den vej over.
Så regner jeg selvfølgelig med at du smider en øl på bordet en dag, hvis jeg nogensinde skulle komme til at møde dig. :)
Men er virkelig ked af at jeg ikke har kunne finde tid til at hjælpe dig videre.
Så nu kan jeg uploaded de billeder jeg vælger i min openfiledialog :)
Men jeg har sådan en picturebox, som billedet bliver vist i før det bliver uploaded til databasen. Og jeg får en fejl hvis billedet bliver vist i den picture box, så siger den at billedet bliver brugt af en anden process.
Men selvom jeg tømmer pictureboxen sådan her
this.pictureBox2.Image = null;
inden jeg uploader, mener windows stadig at filen er i brug. Hvordan løser jeg lige det problem?
Det endte med at han loaded billedet ind i en picture box, som vi bagefter udlæste billedet fra igen, lavede om til et byte[], og sendte det op til serveren.
Jeps. Jeg poster lige en komplet kildekode her engang i weekenden, hvordan man uploader billeder til databasen og hvordan man får det ned i en picturebox igen.
Men det er The Party Dog's fortjeneste, skal det lige siges.
Sorry jeg først kommer med et eksempel nu, har ikke haft tid før...
Jeg har lavet et lille test program som lovet for at demonstrere hvordan man uploader billeder til en MySQL Database. Programmet indeholder en lille picturebox, så man kan se billedet man vil have uploadet inden det bliver puttet ind i databasen.
Min database hedder ”pictures”, og indeholder tabellen ”billeder”. ”billeder” har 2 kolonner id som autogenerer et nummer, så hver billede for et unikt nummer. Den anden kolonne hedder ”pic” og er af typen MediumBlob.
Her er nogen af de mest almindelige typer til at opbevare binær data med i MySQL
Blob 65 Kb MediumBlob 16,7 Mb LongBlob 4,3 Gb
Så MediumBlob må være vores valg til at gemme billeder I, da det er sjældent at billeder bliver større end 16,7 Mb.
Så til selve programmet som indeholder følgende Controls.
Jeg har oversat et lille stykke fra min MySQL bog, hvor de omtaler om man bør opbevare binær data i sin database og billeder er jo binær data… Synes lige det skulle med, bare lige for en god ordens skyld 
Der er noget debat blandt database udviklere om man bør opbevare binær data i sin database eller ej. Alternativet ville være at opbevare det på en traditionel fil server, og så gemme stien i databasen. Der er fordele og ulemper ved begge valg
Hvis man opbevarer sine binære data i databasen, laver man også backup af dem, når man laver backup af resten af databasen. Alle der har adgang til databasen får også adgang til de binære data.
På den anden side skal der også skrives ekstra SQL kode, for at gemme og hente dine binære data ud fra databasen. Og man kan måske tabe noget ”performance”.
Så det er op til den enkelte udvikler hvad man vælger
Også til sidst så får i lige kildekoden. I må i øvrigt undskylde hvis der er for mange stavefejl, håber der er nogen der kan bruge det til noget. God fornøjelse :)
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.IO;
namespace Picture_Upload_Mysql_Db { public partial class Form1 : Form { public Form1() { InitializeComponent(); this.openfile.Filter = "Alle billedfiler|*.bmp;*.jpg;*.jpeg;*.jpe;*.jfif;*.gif|JPEG (*.JPG,*.JPEG,*.JPE,*" + ".JFIF)|*.jpg;*.jpeg;*.jpe;*.jfif|GIF (*.GIF)|*.gif|Bitmap filer (*.bmp)|*.bmp|Al" + "le filer (*.*)|*.*";
catch { MessageBox.Show("Det valgte billed format er ikke understøttet", "Filformat ikke understøttet", MessageBoxButtons.OK, MessageBoxIcon.Error); } }
conn = new MySql.Data.MySqlClient.MySqlConnection(); cmd = new MySql.Data.MySqlClient.MySqlCommand();
string SQL;
//Laver en memoryStream som henter billedet ud af picturebox2 //og putter det ned i et byte array, så det kan uploades til databasen Image imgPicture = pcbPicture.Image; MemoryStream ms = new MemoryStream(); imgPicture.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); ms.Position = 0; byte[] Picture = new byte[ms.Length]; ms.Read(Picture, 0, (int)ms.Length);
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.