Převod obrázku z PictureBox   zodpovězená otázka

VB.NET

Dobrý večer všem,

mám problém s převodem obrázku do datové podoby. Potřeboval bych Drawing.Image nebo Drawing.Bitmap převést do takové podoby, abych jej mohl:

a) Uložit do databáze

b) Případně poslat přes TCP/IP spojení

Zkoušel jsem různé věci, ale nic nefungovalo, všechno mi jen vrátilo typ (System.Drawing.Image).

Předem děkuji za veškeré podněty. Nechci zde hotové kódy, stačí jen napsat, jakou na to použit funkci.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Stačí to uložit do BASE64. Pokud to není nějak extra velký obrázek, neměla by zhruba o 40% větší velikost dělat problém.

- Vytvořte System.IO.MemoryStream

- Zavolejte metodu Save obrázku a uložte jej do streamu

- Pomocí třídy System.Convert zkonvertuje na BASE64 řetězec (Convert.ToBase64String(<memorystream>.ToArray())

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Proč zbytečně kódovat do Base64? Pokud se bude přenášet přes TCP a ne nějaké high-level protokoly (HTTP) nebo ukládat jako String tak to nemá smysl a mnohem rychlejší to bude poslat jako pole bajtů.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

To jistě ano, ale to mě, jako člověku, který s TCP/IP dělal jednou nebo dvakrát v životě, hned nedojde. Omlouvám se.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak jsem zkoušel to, co jste mi tu radili a mám následujicí problém:

- mám v DB tabulku, kde mám sloupec Data, který jsem označil jako image

- přes openFileDialog se snažím načíst soubor

Ten kód mi funguje:

Bitmap TempBitmap = (Bitmap)Image.FromFile(openFileDialog1.FileName);
TempBitmap.Save(streamObrazek, ImageFormat.Png);

Ale jakmile ten streamObrazek předám jako parametr databázi, tak mi to nahlásí chybu. Zkoušel jsem různé varianty jako například ToArray(), atd. Tak bych se chtěl zeptat, co mám předat databázi?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Jenom drobý dodatek, příklad je napsaný v C#, protože jsem to zkoušel jak ve VB.NET, tak i v C#, ale nefunguje to ani v jednom.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zdaleka nejjednoduší je použít Stored Proceduru a pro její volání použít předpřipravené .NET prostředky, ty už si ten stream na image přeloží.

Může to pak vypadat zhruba takto:

using (SqlConnection conn = new SqlConnection("context connection=true"))
        {
            SqlCommand command = new SqlCommand();
            command.CommandType = CommandType.StoredProcedure;
            command.Connection = conn;
            command.CommandText = "sp_insert_image";

            SqlParameter parm1 = new SqlParameter();
            parm1.Direction = ParameterDirection.Input;
            parm1.SqlDbType = SqlDbType.Image;
            parm1.ParameterName = "@ImageData";
            parm1.Value = stream;

            command.Parameters.Add(parm1);

            conn.Open();
            SqlDataReader rdr = command.ExecuteNonQuery();

SPROC na databázi je poté obyčejný INSERT

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Děkuji za dobrou radu.

Akorát drobná poznámka, tento kód mi házel chyby, musel jsem si ho upravit a popřemýšlet, což my vyhovuje více, než kdybyste mi sem dal na 100% fungující zdroják ;-)

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback