[OT] jak na rychle vykreslovani bitmap, Win, C#
Petr Weissar
weissar na kae.zcu.cz
Pondělí Leden 19 21:11:14 CET 2015
Zdravim,
udelal bych to tak, ze by udelal novou Bitmap, do ni zkopiroval cast te
stare bez prvniho (nebo nekolika prvnich) radku a na ty posledni dal
nova data. Novou dam vykreslit a starou zahodi "nekdy" GC :-)
Musel bych si to napsat, ale otazka byla na "cestu".
Jeste mne napada pak optimalizovat nova data vytvorenim "mensi bitmapy",
mozna to ma nejakou funkci na nacteni z pole a pak zase vkopirovat do
ciloveho obrazu. Pokud by to slo, vyhybal bych se LockBits, pokud to je
v knihovne, bude to rychlejsi (nejspis :-))
Petr
Dne 19. 1. 2015 v 19:43 Jaroslav Buchta napsal(a):
> Jakym smerem se vydat? Potrebuju v podstate rychle posouvat radky v okne
> a pridavat nove radky, je to pro vizualizaci dat z radkove kamery.
> Tak 1000 radku/s po 512 px by bylo ideal. Uvedeny kod zvladne tak 40
> (512x500 pixelu) takze to chce vice nez radove zlepseni vykonu.
>
> Zatim jsem udelal tento hruby pokus a tudy cesta asi nevede (da se to
> urcite jeste optimalizovat ale je to v principu same kopirovani velkeho
> pole)
>
> Existuje nejaka lepsi metoda, jak rychle periodicky zobrazovat v okne
> aktualni obraz ktery je jako pole pixelu? Ale zas univerzalni, aby to
> nebylo vazane na nejakou konkretni graf. kartu, cpu atp.
>
> private unsafe void backgroundWorker1_DoWork(object sender,
> DoWorkEventArgs e)
> {
>
> while (!bwFin)
> {
>
> BitmapData bmd = bmp.LockBits(new Rectangle(0, 0,
> bmp.Width, bmp.Height), ImageLockMode.WriteOnly, bmp.PixelFormat);
>
> IntPtr ptr = bmd.Scan0;
>
> int lnBytes = Math.Abs(bmd.Stride);
> int bytes = lnBytes * bmp.Height;
> if (rgbValues == null)
> {
> rgbValues = new byte[bytes];
>
> }
> else
> {
> byte[] ba = rgbValues.Skip(lnBytes).ToArray();
> rgbValues = new byte[bytes];
> ba.CopyTo(rgbValues, 0);
> }
>
> for (int y = bmp.Height-1; y < bmp.Height; y++)
> {
> byte[] ln = new byte[bmp.Width * 4];
> for (int x = 0; x < bmp.Width; x++)
> {
> byte l = byte((x + y + bmOfs) % 256);
> ln[x * 4 + 0] = l;
> ln[x * 4 + 1] = l;
> ln[x * 4 + 2] = l;
> ln[x * 4 + 3] = 255;
> }
> ln.CopyTo(rgbValues, lnBytes * (bmp.Height - 1));
> }
>
> System.Runtime.InteropServices.Marshal.Copy(rgbValues, 0, ptr,
> bmp.Height * lnBytes);
>
> bmp.UnlockBits(bmd);
>
> bmOfs++;
> if (bmOfs > bmp.Height) bmOfs = 0;
>
> pictureBox1.Image = bmp.Clone() as Image;
> }
> pictureBox1.Image = null;
> }
>
>
> ---
> This email has been checked for viruses by Avast antivirus software.
> http://www.avast.com
>
> _______________________________________________
> HW-list mailing list - sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
Další informace o konferenci Hw-list