Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с изображением, глубина цвета 
V
    Опции темы
Moid
Дата 3.3.2008, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 396
Регистрация: 27.3.2006

Репутация: 2
Всего: 3



Хочу установить глуюину цвета у Bitmap.
Есть у него такое свойство PixelFormat. Напрямую оно доступно только для чтения. 
В MSDN нашел такой способ:
Код

Bitmap  bitmap = new Bitmap(Width, 
                            Height, 
                            PixelFormat.Format8bppIndexed); 


пытаюсь затем нарисовать свое изображение на битмапе:
Код

Graphics g = Graphics.FromImage(bitmap);

вылетае ошибка.

Может какой то другой способ нужно использовать?
Как мне поместить изображение в битмап с заданными параметрами PixelFormat?


--------------------
"Всё должно быть сделано настолько простым, насколько это возможно, но не проще" (с) А.Эйнштейн
PM MAIL   Вверх
Moid
Дата 3.3.2008, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 396
Регистрация: 27.3.2006

Репутация: 2
Всего: 3



вот весь метод:
        
Код

public static void SavePNG1(Image image, string fileName, long compression)
        {
            Bitmap bm = new Bitmap(image.Width, image.Height, PixelFormat.Format24bppRgb);
            Graphics g = Graphics.FromImage(bm);
            g.PageUnit = GraphicsUnit.Pixel;
            g.DrawImage(image, 0, 0, image.Width, image.Height);
            g.Dispose();
            //---
            bm.Save(fileName); 
         }


если выбираем формат пикселя Rgb, Argb, то все хорошо. Но если глубину в 8 бит (Format8bppIndexed) вылетает ошибка.


--------------------
"Всё должно быть сделано настолько простым, насколько это возможно, но не проще" (с) А.Эйнштейн
PM MAIL   Вверх
tea_723
Дата 3.3.2008, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 13.9.2007

Репутация: нет
Всего: нет



Не работает .Net с Indexed форматами нормально. Посмотри ссылку, может чем поможет.
http://www.codeproject.com/KB/GDI-plus/Bit...eConverter.aspx 
PM MAIL   Вверх
Moid
Дата 4.3.2008, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 396
Регистрация: 27.3.2006

Репутация: 2
Всего: 3



tea_723, не помагает.
Некоторые предлогают использовать Format16bppRgb555 вместо Format8bppIndexed, но такой вариант не подходит. Нужно изменить палитру в 256 цветов.
Может это можно сделать не используя PixelFormat?

Это сообщение отредактировал(а) Moid - 4.3.2008, 17:39


--------------------
"Всё должно быть сделано настолько простым, насколько это возможно, но не проще" (с) А.Эйнштейн
PM MAIL   Вверх
Bogdan1024
Дата 4.3.2008, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1436
Регистрация: 28.9.2005
Где: Киев

Репутация: 5
Всего: 13



Может нужно задать палитру прежде чем рисовать?


--------------------
user posted image
PM MAIL   Вверх
Moid
Дата 5.3.2008, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 396
Регистрация: 27.3.2006

Репутация: 2
Всего: 3



Так я сначала и задаю палитру:
Код

Bitmap bm = new Bitmap(image.Width, image.Height, PixelFormat.Format24bppRgb);

А потом рисую.


--------------------
"Всё должно быть сделано настолько простым, насколько это возможно, но не проще" (с) А.Эйнштейн
PM MAIL   Вверх
Moid
Дата 6.3.2008, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 396
Регистрация: 27.3.2006

Репутация: 2
Всего: 3



Передаем в параметр (Bitmap, глубину цвета, серое или цветное)

Код

#region gdi32
        [System.Runtime.InteropServices.DllImport("gdi32.dll")]
        public static extern bool DeleteObject(IntPtr hObject);

        [System.Runtime.InteropServices.DllImport("user32.dll")]
        public static extern int InvalidateRect(IntPtr hwnd, IntPtr rect, int bErase);

        [System.Runtime.InteropServices.DllImport("user32.dll")]
        public static extern IntPtr GetDC(IntPtr hwnd);

        [System.Runtime.InteropServices.DllImport("gdi32.dll")]
        public static extern IntPtr CreateCompatibleDC(IntPtr hdc);

        [System.Runtime.InteropServices.DllImport("user32.dll")]
        public static extern int ReleaseDC(IntPtr hwnd, IntPtr hdc);

        [System.Runtime.InteropServices.DllImport("gdi32.dll")]
        public static extern int DeleteDC(IntPtr hdc);

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

        [System.Runtime.InteropServices.DllImport("gdi32.dll")]
        public static extern int BitBlt(IntPtr hdcDst, int xDst, int yDst, int w, int h, IntPtr hdcSrc, int xSrc, int ySrc, int rop);
        static int SRCCOPY = 0x00CC0020;

        [System.Runtime.InteropServices.DllImport("gdi32.dll")]
        static extern IntPtr CreateDIBSection(IntPtr hdc, ref BITMAPINFO bmi, uint Usage, out IntPtr bits, IntPtr hSection, uint dwOffset);
        static uint BI_RGB = 0;
        static uint DIB_RGB_COLORS = 0;
        [System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential)]
        public struct BITMAPINFO
        {
            public uint biSize;
            public int biWidth, biHeight;
            public short biPlanes, biBitCount;
            public uint biCompression, biSizeImage;
            public int biXPelsPerMeter, biYPelsPerMeter;
            public uint biClrUsed, biClrImportant;
            [System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst = 256)]
            public uint[] cols;
        }

        static uint MAKERGB(int r, int g, int b)
        {
            return ((uint)(b & 255)) | ((uint)((r & 255) << 8)) | ((uint)((g & 255) << 16));
        }
        #endregion

        public static Bitmap CopyToBpp(Bitmap b, int bpp, bool grayscale)
        {
            // (1) Convert our Bitmap into a GDI hbitmap (ie. copy unmanaged->managed)
            // (2) Create a GDI monochrome hbitmap
            // (3) Use GDI "BitBlt" function to copy from hbitmap into monochrome (as above)
            // (4) Convert the monochrone hbitmap into a Bitmap (ie. copy unmanaged->managed)

            if (bpp != 1 && bpp != 8) throw new System.ArgumentException("1 or 8", "bpp");

            int w = b.Width, h = b.Height;
            IntPtr hbm = b.GetHbitmap(); // this is step (1)
            // Step (2): create the monochrome bitmap.
            BITMAPINFO bmi = new BITMAPINFO();
            bmi.biSize = 40;  // the size of the BITMAPHEADERINFO struct
            bmi.biWidth = w;
            bmi.biHeight = h;
            bmi.biPlanes = 1; 
            bmi.biBitCount = (short)bpp; // ie. 1bpp or 8bpp
            bmi.biCompression = BI_RGB; 
            bmi.biSizeImage = (uint)(((w + 7) & 0xFFFFFFF8) * h / 8);
            bmi.biXPelsPerMeter = 1000000; // not really important
            bmi.biYPelsPerMeter = 1000000; // not really important
            // Now for the colour table.
            uint ncols = (uint)1 << bpp; // 2 colours for 1bpp; 256 colours for 8bpp
            bmi.biClrUsed = ncols;
            bmi.biClrImportant = ncols;
            bmi.cols = new uint[256]; // The structure always has fixed size 256, even if we end up using fewer colours
            if (bpp == 1) { bmi.cols[0] = MAKERGB(0, 0, 0); bmi.cols[1] = MAKERGB(255, 255, 255); }
            else
            {
                if (grayscale)
                {
                    for (int i = 0; i < ncols; i++) bmi.cols[i] = MAKERGB(i, i, i);
                }
                else
                {
                    bmi.biClrUsed = 216; 
                    bmi.biClrImportant = 216; 
                    int[] colv = new int[6] { 0, 51, 102, 153, 204, 255 };
                    for (int i = 0; i < 216; i++) bmi.cols[i] = MAKERGB(colv[i / 36], colv[(i / 6) % 6], colv[i % 6]);
                }
            }
            IntPtr bits0; 
            IntPtr hbm0 = CreateDIBSection(IntPtr.Zero, ref bmi, DIB_RGB_COLORS, out bits0, IntPtr.Zero, 0);
            //
            // Step (3): use GDI's BitBlt function to copy from original hbitmap into monocrhome bitmap
            IntPtr sdc = GetDC(IntPtr.Zero);      
            IntPtr hdc = CreateCompatibleDC(sdc); SelectObject(hdc, hbm);
            IntPtr hdc0 = CreateCompatibleDC(sdc); SelectObject(hdc0, hbm0);
            BitBlt(hdc0, 0, 0, w, h, hdc, 0, 0, SRCCOPY);
            // Step (4): convert this monochrome hbitmap back into a Bitmap:
            System.Drawing.Bitmap b0 = System.Drawing.Bitmap.FromHbitmap(hbm0);
            //
            DeleteDC(hdc);
            DeleteDC(hdc0);
            ReleaseDC(IntPtr.Zero, sdc);
            DeleteObject(hbm);
            DeleteObject(hbm0);
            //
            return b0;
        }



--------------------
"Всё должно быть сделано настолько простым, насколько это возможно, но не проще" (с) А.Эйнштейн
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0737 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.