IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Image(.bmp, .jpg, ...) z IntPtr

V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
HHavelHHonza
Člen
Avatar
HHavelHHonza:17.4.2014 12:22

Zdary,

potřebuju radu z oblasti vykreslování obrázků:)

mám k dispozici toto:

/////////////­////////////////////////­////////////////////////­////////
Tato funkce vrátí pointer na blok paměti, kde je uložen aktuální zpracovaný snímek z kamery (tedy snímek po průchodu softwarovými filtry, stabilizací, apod.).
Funkce funguje totožně jako funkce GetRawImagePointer, bližší popis je tedy stejný (viz výše).

int8_t GetOutImagePo­inter(uint64_t *PixelPointerOut, int32_t *BufferSize, int32_t *PixelSize, int32_t *LineWidth, int32_t *XResolution, int32_t *YResolution)
o uint64_t PixelPointerOut - pointer na první pixel snímku v paměti (ve snímku vlevo nahoře)
o int32_t PixelSize - počet bytů obsahujících hodnotu jednoho pixelu
o int32_t BufferSize - celkový počet bytů snímku v paměti
o int32_t LineWidth - délka jednoho řádku snímku v paměti (včetně pomocných obrazových pixelů)
o int32_t XResolution - skutečné horizontální rozlišení snímku
o int32_t YResolution - skutečné vertikální rozlišení snímku
/////////////­////////////////////////­/////////////////////////

Jedná se o metodu knihovny pro obsluhu termokamery (to jen tak na okraj). Jde mi o způsob, jakým pomocí této metody vykreslit obrázek aktuálního snímku (.bmp, .jpg, ...) ve WinForms a uložit jej. Obávám se, že tohle je málo:

Získání pointeru:

Int64 PixelPointerOut2;
            Int32 BufferSize2;
            Int32 PixelSize2;
            Int32 LineWidth2;
            Int32 XResolution2;
            Int32 YResolution2;

            int status = GetOutImagePointer(&PixelPointerOut2, &BufferSize2, &PixelSize2, &LineWidth2, &XResolution2, &YResolution2);


            IntPtr _bitmapPointer = new IntPtr(PixelPointerOut2);
            Image img = Bitmap.FromHbitmap(_bitmapPointer); //Tady exception A Generic error occurs at GDI+

            Bitmap bitmap = new Bitmap(img);
            //return _bitmapPointer;
            return bitmap;

Samotné vykreslení:

Image img = _tCam.DrawWeldPicture();
      img.Save("obrazek.bmp");
      picDrawSnap.Image = img;
      picDrawSnap.Dock = DockStyle.Fill;

Díky za pomoc

 
Odpovědět
17.4.2014 12:22
Avatar
Odpovídá na HHavelHHonza
Luboš Běhounek Satik:17.4.2014 12:32

Ahoj,
můžeš si to normálně zkopírovat do pole intů nebo bytů přes Marshal.Copy()
a pak podle struktury těch dat (barevné hloubky a pořadí barevných kanálů) to z toho buďto ručně vytahat a nacpat do bitmapy a nebo to prohnat nějakou funkcí, mělo by to snad jít třeba nějak takhle:

ImageConverter ic = new ImageConverter();
Image img = (Image)ic.ConvertFrom(byteArray);
Bitmap bitmap1 = new Bitmap(img);

http://msdn.microsoft.com/…vs.100).ASPX

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
17.4.2014 12:32
https://www.facebook.com/peasantsandcastles/
Avatar
HHavelHHonza
Člen
Avatar
Odpovídá na Luboš Běhounek Satik
HHavelHHonza:18.4.2014 16:41

Díky, jsem idiot, že jsem se upnul na Bitmap.FromHbit­map(_bitmapPo­inter);...

Řešení bylo opravdu jednoduchý, ručně jsem to rozházel pixel po pixelu...

 
Nahoru Odpovědět
18.4.2014 16:41
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 3 zpráv z 3.