Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Программирование под Windows > .NET
Перезагрузить страницу Bitmap в массив пикселей
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
sashar2 sashar2 вне форума
Member
 
Сообщений: 131
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 17.09.2005
По умолчанию 22.08.2007, 10:07

Пишу на C#, хочу преобразовать имеющийся Bitmap в массив пикселей argb т.е типа int. Пробовал переписывать битмап в MemoryStream, после находил служебную информацию - опускал, считывал по 4 бита из потока, но нужного результата достич не смог.
В итоге хочу получить быстрым способом двумерный массив int, помогите пожалуйста.
Ответить с цитированием
  (#2 (permalink)) Старый
sashar2 sashar2 вне форума
Member
 
Сообщений: 131
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 17.09.2005
По умолчанию 24.08.2007, 10:15

Код написал, как приду домой - выложу. Теперь только вот проблема преобразовать битмап (из файла, если он 24 бита или на мониторе низкая битность) в 32 бита, как это сделать я еще не понял.
Снимок экрана 32бита 1280х1024 на моей системе занимает около 100мс + все преобразования, на с++ занимает 80мс, но там используется GetDIBits и изображение после не переворачивается, думаю, если перевернуть, то будет столько же.
Ответить с цитированием
  (#3 (permalink)) Старый
sashar2 sashar2 вне форума
Member
 
Сообщений: 131
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 17.09.2005
По умолчанию 24.08.2007, 20:42

Как и обещал, выкладываю код получения пикселей экрана, но работает только для 32 бит пока что. Жду вашей помощи и сам ищу решение.
Код:
        [DllImport("gdi32.dll")]
        static extern bool BitBlt(
            IntPtr hdc, 
            int nXDest, 
            int nYDest, 
            int nWidth, 
            int nHeight, 
            IntPtr hdcSrc, 
            int nXSrc, 
            int nYSrc, 
            uint dwRop
            );

        [DllImport("gdi32.dll")]
        static extern IntPtr CreateCompatibleDC(
            IntPtr hdc
            );

        [DllImport("gdi32.dll")]
        static extern IntPtr CreateCompatibleBitmap(
            IntPtr hdc, 
            int nWidth, 
            int nHeight
            );

        [DllImport("gdi32.dll")]
        static extern bool DeleteObject(
            IntPtr hObject
            );

        [DllImport("gdi32.dll")]
        static extern bool DeleteDC(
            IntPtr hdc
            );

        [DllImport("gdi32.dll")]
        static extern int GetDeviceCaps(IntPtr hdc, 
            int nIndex
            );

        [DllImport("gdi32.dll")]
        static extern IntPtr CreateDC(
            string lpszDriver, 
            string lpszDevice, 
            string lpszOutput, 
            string lpInitData
            );

        [DllImport("gdi32.dll")]
        static extern IntPtr SelectObject(
            IntPtr hdc, 
            IntPtr hgdiobj
            );

        [DllImport("kernel32")]
        static extern bool CloseHandle(
            IntPtr hFile
            );

        [DllImport("user32.dll")]
        static extern int ReleaseDC(
            IntPtr hWnd, 
            IntPtr hDC
            );

        private struct RasterOperationCode
        {
            public const int BLACKNESS = 0x00000042;
            public const int NOTSRCERASE = 0x001100A6;
            public const int NOTSRCCOPY = 0x00330008;
            public const int SRCERASE = 0x00440328;
            public const int DSTINVERT = 0x00550009;
            public const int PATINVERT = 0x005A0049;
            public const int SRCINVERT = 0x00660046;
            public const int SRCAND = 0x008800C6;
            public const int MERGEPAINT = 0x00BB0226;
            public const int MERGECOPY = 0x00C000CA;
            public const int SRCCOPY = 0x00CC0020;
            public const int SRCPAINT = 0x00EE0086;
            public const int PATCOPY = 0x00F00021;
            public const int PATPAINT = 0x00FB0A09;
            public const int WHITENESS = 0x00FF0062;
        }

        private struct DeviceCapsIndex
        {
            public const int Width = 8;
            public const int Height = 10;
        }

        public static int[,] GetDisplayPixelArray()
        {
            IntPtr hDesktopDC = CreateDC("DISPLAY", "", "", "");
            int Width = GetDeviceCaps(hDesktopDC, DeviceCapsIndex.Width);
            int Height = GetDeviceCaps(hDesktopDC, DeviceCapsIndex.Height);
            IntPtr hMyDC = CreateCompatibleDC(hDesktopDC);
            IntPtr hBitmap = CreateCompatibleBitmap(hDesktopDC, Width, Height);
            IntPtr hOldBmp = SelectObject(hMyDC, hBitmap);
            BitBlt(hMyDC, 0, 0, Width, Height, hDesktopDC, 0, 0, RasterOperationCode.SRCCOPY);
            Bitmap DisplayBitmap = Bitmap.FromHbitmap(hBitmap);
            int[,] Pixels = new int[Width, Height];
            using (MemoryStream ms = new MemoryStream())
            {
                DisplayBitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
                byte[] Bytes = ms.ToArray();
                long pos = Bytes.Length;
                for (int j = 0; j < Height; j++)
                {
                    for (int i = Width; i-- > 0; )
                    {
                        Pixels[i, j] =
                            (Bytes[--pos] << 24) |
                            (Bytes[--pos] << 16) |
                            (Bytes[--pos] << 8) |
                            (Bytes[--pos]);
                    }
                }
                Bytes = null;
            }
            DisplayBitmap.Dispose();
            DeleteObject(SelectObject(hMyDC, hOldBmp));
            DeleteDC(hMyDC);
            DeleteDC(hDesktopDC);
            CloseHandle(hBitmap);
            CloseHandle(hOldBmp);
            ReleaseDC(IntPtr.Zero, hMyDC);
            ReleaseDC(IntPtr.Zero, hDesktopDC);
            return Pixels;
        }
Ответить с цитированием
  (#4 (permalink)) Старый
ComatoZZZ ComatoZZZ вне форума
Member
 
Сообщений: 100
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 09.06.2007
По умолчанию 26.08.2007, 16:02

А обязательно через апи??

у меня был гдето пример с .lockbits, или это не то?
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запись координат в массив в реал тайм, Как записать координаты в массив Dark19 С/С++ 2 21.06.2011 23:03
Запись координат в массив в реал тайм, Как записать координаты в массив Dark19 Программирование графики 0 21.06.2011 14:46
В чем причина битых пикселей? Видеокарта ATI RADEON HD 5570 MSI 1GIG?li Kolyan2704 Любые вопросы от новичков 3 06.03.2011 15:32
Задан массив А,состоящий из 20 элементов. Получить из него массив В Наташок Visual Basic 0 22.12.2010 22:35
Отрисовка пикселей по RGB o.tel.o C++ Builder 13 24.03.2010 20:02
Создание шапки на 200 пикселей dinero DHTML, JavaScript, VBScript 4 29.11.2009 12:59
Web Camera - с каким разрешением и на сколько пикселей лучше купить? Subzero Любые вопросы от новичков 4 21.02.2008 16:47
OpenGL and Bitmap как рисовать Sleem Программирование графики 0 05.12.2006 00:40
Мерцание без BitMap Sleem C++ Builder 0 12.11.2006 00:52
Картинка на форму Bitmap в С++ Donner Visual C++ 1 14.04.2005 23:16
Текстура из Bitmap VolanD Программирование графики 0 07.03.2005 16:56



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов