Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem .NET C#: Dynamicke nacitani JPG do bitmapy

Asi se ptám zbytečně, ale říkám si za zkoušku nic nedáš.

Když si vytvoříme bitmapu:

System.Windows.Forms.PictureBox pictureBox1;

Tak do ní lze následně nahrávat obrázky v (prakticky) libovolném formátu:

pictureBox1.Image = new Bitmap("obrazek.jpg");

Tato funkce pracuje správně ve Windows na PC.

Na Windows mobile ovšem pracuje správně jenom občas.

Pokud obrázek není větší než zhruba 300 kB pracuje dobře všude.

Pokud je ovšem větší (typicky kvalitní fotografie např. 700 kB)
Na PC to pracuje perfektně. Ovšem na Windows Mobile se děje toto:
[http://img266.imageshack.us/img266/8071/mydemoql1.j pg]

Pokud znáte způsob jak na Windows mobile je možné tuto hranici překonat
sdělte mi to prosím.
Hlavně ať prosím odpovidá někdo kdo ví o čem mluví. Radu typu udělej si dekodérové knihovny pro
formáty typů JPG nechci slyšet.

Díky

Předmět Autor Datum
Približne 700kB JPG zodpovedá 2Mpx fotke, ktorá celá v pamäti zaberá cca. 6MB (1600x1200x24). To je…
los 04.10.2007 22:50
los
Ufff. No dobře. Už jsem ale progoogloval asi hodinu.
Flash_Gordon 04.10.2007 22:51
Flash_Gordon
Ak vie ten obrázok zobraziť Pocket IE, môžeš skúsiť použiť rovnaký spôsob pomocou použitia knižnice…
los 04.10.2007 23:27
los
Bere to. Ale fakt nechci dělat v C++. Nerozumím tomu prostě. Snad existuje způsob jak píše níže. Imp…
Flash_Gordon 04.10.2007 23:39
Flash_Gordon
Neviem či sa dá tomu nejako vyhnúť, skôr skontroluj buď na emulátore akú máš pridelenú pamäť alebo v…
Len tak 04.10.2007 22:51
Len tak
Paměť jsem přiděloval co to šlo jak na PDA tak na emulatoru. Výsledek stejný. (Přeplnění vyhrazeného…
Flash_Gordon 04.10.2007 23:09
Flash_Gordon
Skús pozrieť na internete zmenšenie obrázka. Potom napíš ako si dopadol
Len tak 04.10.2007 23:25
Len tak
Zasekl jsem se. Protože už tento řádek dělá tu chybu: new Bitmap("velkyObrazek") // bum Jestli js…
Flash_Gordon 05.10.2007 00:05
Flash_Gordon
Do streamu sa dá, len potom zase - ako ho zmenšíš poprípade vykreslíš? Tak či tak ho načíta do pamät…
Len tak 05.10.2007 08:54
Len tak
Dobře a víš tedy o nějakém článku jak se pracuje s knihovnama pro Win32 v .NET ?
squad_leader(unreg) 05.10.2007 10:01
squad_leader(unreg)
Pozri sa po nejakých COM komponentách, tie jednoducho načítaš v .NET. Doporučujem ti pogoogliť. poslední
Len tak 05.10.2007 11:39
Len tak

Približne 700kB JPG zodpovedá 2Mpx fotke, ktorá celá v pamäti zaberá cca. 6MB (1600x1200x24). To je na PDA celkom dosť, takže budeš potrebovať nejakú knižnicu, ktorá nenahráva do pamäte celý obrázok ako System.Drawing.Image.

Konkrétnu knižnicu neporadím, pretože som také niečo zatiaľ nepotreboval, ale snáď niečo schopné cez Google nájdeš.

Neviem či sa dá tomu nejako vyhnúť, skôr skontroluj buď na emulátore akú máš pridelenú pamäť alebo v PDA skontroluj aké máš množstvo vyhradenej pamäti na aplikácie.

Ako vidím, ty obrázok BITMAPU asociuješ do pic.boxu, skús najprv vytvoriť bitmapu a priamo ju zmenšiť a následne asociovať do pic.boxu. Teoreticky by to malo ísť, potom daj vedieť.

public Bitmap ResizeBitmap( Bitmap b, int nWidth, int nHeight )
{
  Bitmap result = new Bitmap( nWidth, nHeight );
  using( Graphics g = Graphics.FromImage( (Image) result ) )
    g.DrawImage( b, 0, 0, nWidth, nHeight );
  return result;
}

Ja osobne robím pod ASP.NET a VB.NET - Visual Basic a nie C#.

Paměť jsem přiděloval co to šlo jak na PDA tak na emulatoru.
Výsledek stejný. (Přeplnění vyhrazeného bufferu ? )

Zkouším:

 public Bitmap ResizeBitmap(Bitmap b, int nWidth, int nHeight)
        {
            Bitmap result = new Bitmap(nWidth, nHeight);
            using (Graphics g = Graphics.FromImage((Image)result))
                g.DrawImage(b, 0, 0, nWidth, nHeight);
            return result;
        }

Ale už po přídání tohoto bloku (bez použítí) to píše 4 errory:

error CS1502: The best overloaded method match for 'System.Drawing.Graphics.DrawImage(System.Drawing. Image, int, int, System.Drawing.Rectangle, System.Drawing.GraphicsUnit)' has some invalid arguments

error CS1503: Argument '4': cannot convert from 'int' to 'System.Drawing.Rectangle'

error CS1503: Argument '5': cannot convert from 'int' to 'System.Drawing.GraphicsUnit'

error CS0144: Cannot create an instance of the abstract class or interface 'System.IO.Stream'

Takže... musím prostudovat manuál asi... :-|

Do streamu sa dá, len potom zase - ako ho zmenšíš poprípade vykreslíš? Tak či tak ho načíta do pamäti. Keďže mám ale v PDA program na obrázky, ktorý nemá problém so zobrazením väčšieho obrázka (ale nie je napísaný pod .NET ale klasicky pod Win32), tak to musí ísť aj takto. Skôr by som ti doporučil použiť nejakú štandardnú DLL knižnicu v PPC na upravenie veľkosti (nie .NET knižnicu).

Zpět do poradny Odpovědět na původní otázku Nahoru