Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem Vykreslení obrázku z byte array

Zdravím, snažím se vykreslit obrázek bmp, který načítám do byte array, ale nedaří se mi to. Potřeboval bych poradit co změnit, aby mi to fungovalo. Chtěl bych, aby to fungovalo jen pro černobílý bmp obrázek pro jednoduchost a chci to uvedeným způsobem pomocí setpixel (ano vím, že je to pomalé).
Díky.

Metodu pro vykreslení mám takto:


public Bitmap VykresliObrazekBMP(Stream stream)
{
            BinaryReader reader = new BinaryReader(stream);
            int range = (int)reader.BaseStream.Length;
            Byte[] bytes = reader.ReadBytes(56);

            List<byte> bytess = new List<byte>();
            foreach(var bajt in bytes)
            {
                bytess.Add(bajt);
            }

            int width = 361;
            int height = 338;
            
            Bitmap bmp = new Bitmap(width, height);

            for (int y = 0; y < height; y++)
            {
                for (int x = 0; x < width; x++)
                {
                    if (bytess.ElementAt(x) == 0)
                    {
                        bmp.SetPixel(x, y, Color.Black);
                    }
                }
            }
            return bmp;
}
Jsou zobrazeny jen nové odpovědi. Zobrazit všechny
Předmět Autor Datum
Přečteš 56 bytů a z toho se snažíš vykreslit obrázek 361x338 pixelů? List bytess je tam zcela zbyteč…
Wikan 02.04.2018 15:51
Wikan
Právě nevím kolik těch bytů mám přečíst, tak tam sem tam střelím nějaké číslo, ale hodí to chybu, že…
Dupla 02.04.2018 15:57
Dupla
Vždyť v range máš délku toho streamu.
Wikan 02.04.2018 16:06
Wikan
Ahaaa, už to nějaké pixely kreslí, ale nějak divně. Dal jsem tam ten vzorec od tebe.
Dupla 02.04.2018 16:08
Dupla
No a jak máš ten obrázek uložený v poli? Po řádcích nebo po sloupcích?
Wikan 02.04.2018 16:10
Wikan
Myslím, že ten BinaryReader to ukládá po řádcích. Jako už to nějaké pixely kreslí, ale není to tak,…
Dupla 02.04.2018 16:15
Dupla
A není to tak prostě proto, že se snažíš nečernobílý obrázek vykreslit černobíle?
Wikan 02.04.2018 16:23
Wikan
Ne ne, dávám tam normálně černobílé bmp (klikatá čára nakreslená a uložená v malování jako bmp černo…
Dupla 02.04.2018 16:26
Dupla
No a víš o tom, že BMP obsahuje i nějakou hlavičku? A taky že když uložíš opravdu černobílý obrázek,…
Wikan 02.04.2018 16:29
Wikan
To vím a s tím si právě nevím rady jak to tam realizovat.
Dupla 02.04.2018 16:32
Dupla
Nastuduješ si strukturu BMP souboru, abys věděl, kolik toho máš přeskočit. No a zbytek si převedeš n…
Wikan 02.04.2018 16:36
Wikan
Tak jsem to trochu upravil a pořád nejde. BinaryReader reader = new BinaryReader(stream); int rang…
Dupla 02.04.2018 17:10
Dupla
No a jsi si opravdu jistý, že je ten BMP v takovém formátu, jaký očekáváš? Jinak podmínka: if (bit…
Wikan 02.04.2018 17:15
Wikan
Ano, jsem. Ale program padá kvůli vyjímce, že někde bere hodnotu null. Tak to už je detail, spíš je…
Dupla 02.04.2018 17:23
Dupla
Někde, kde? Pokud chceš poradit, musíš poskytovat veškeré informace. Zatím to z tebe leze jako z chl…
Wikan 02.04.2018 17:25
Wikan
Padá to na tom řádku Array.Copy(bytes, 0, newBytes, 54, range - 54); Když to nahradím newBytes = byt…
Dupla 02.04.2018 17:35
Dupla
Černá = false, ty to máš obráceně. Jen tak pro zajímavost, jaké má ten obrázek rozměry v pixelech a…
Wikan 02.04.2018 17:42
Wikan
Jo, na to jsem teď taky došel. Obrázek má rozměry 1403 x 693 pixelů a velikost 122 030 bytů.
Dupla 02.04.2018 17:44
Dupla
A vážně se to snažíš vykreslit do bitmapy 361x338?
Wikan 02.04.2018 17:46
Wikan
Nejspíš na tom záležet nebude, protože i když mám obrázek stejné velikosti, tak to padá na vykreslov…
Dupla 02.04.2018 17:48
Dupla
A jsme zase u toho. Co přesně znamená, že to padá? A samozřejmě na tom záleží sakra hodně.
Wikan 02.04.2018 17:53
Wikan
Padá to na podmínce if (bity[y * width + x] == false) a píše to: "An unhandled exception of type 'Sy…
Dupla 02.04.2018 18:02
Dupla
Takže v tom poli máš evidentně míň prvků, než očekáváš.
Wikan 02.04.2018 18:06
Wikan
Vždyť by to mělo být od 54, protože 14 bytů je hlavička + 40 bytů jsou informace o souboru, ne?
Dupla 02.04.2018 18:18
Dupla
Podle tohohle: https://en.wikipedia.org/wiki/BMP_file_format to zdaleka není tak jednoduché.
Wikan 02.04.2018 18:27
Wikan
Právě proto se ptám zkušených.
Dupla 02.04.2018 18:31
Dupla
Schopnost přečíst dokumentaci nijak nesouvisí se zkušeností. To za tebe nikdo neudělá. poslední
Wikan 02.04.2018 18:33
Wikan

Tak jsem to trochu upravil a pořád nejde.


            BinaryReader reader = new BinaryReader(stream);
            int range = (int)reader.BaseStream.Length;
            Byte[] bytes = reader.ReadBytes(range);
            int width = 361;
            int height = 338;
            Byte[] newBytes = null;
            Array.Copy(bytes, 0, newBytes, 54, range - 54);
            BitArray bity = new BitArray(newBytes);

            Bitmap bmp = new Bitmap(width, height);

            for (int y = 0; y < height; y++)
            {
                for (int x = 0; x < width; x++)
                {
                    if (bity[y * width + x] == true)
                    {
                        bmp.SetPixel(x, y, Color.Black);
                    }
                }
            }

Padá to na podmínce if (bity[y * width + x] == false) a píše to:
"An unhandled exception of type 'System.ArgumentOutOfRangeException' occurred in mscorlib.dll
Additional information: Index je mimo rozsah. Index musí být nezáporný a musí být menší než velikost kolekce."

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