Как програмно сконвертировать 8 битный цвет в 32 битный?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
-=TsA=-
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 142
Зарегистрирован: 21.09.2004 (Вт) 14:32
Откуда: Татарстан, Заинск

Как програмно сконвертировать 8 битный цвет в 32 битный?

Сообщение -=TsA=- » 29.06.2007 (Пт) 8:35

Как програмно сконвертировать 8 битный цвет в 32 битный?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 29.06.2007 (Пт) 8:51

8-битного цвета не существует в Windows.
Lasciate ogni speranza, voi ch'entrate.

nekeda
Постоялец
Постоялец
 
Сообщения: 710
Зарегистрирован: 10.04.2005 (Вс) 23:20

Сообщение nekeda » 29.06.2007 (Пт) 9:06

как и 32-битного :)

загрузи 8ми битную картинку в пикчурбокс - Picture.Point всё равно вернёт Long - 24ёх битный цвет.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 29.06.2007 (Пт) 9:25

Оба врёте. И 8-битный, и 32-битный цвет бывает.

От TsA требуется более корректно сформулированное условие.
Изображение

nekeda
Постоялец
Постоялец
 
Сообщения: 710
Зарегистрирован: 10.04.2005 (Вс) 23:20

Сообщение nekeda » 29.06.2007 (Пт) 17:13

Бывают картинки, для хранения каждой точки которых используется 2/8/16/24/32/48 бита. Но в конечном итоге на монитор идут три байта - красный, зелёный, синий.. нет?

Я так понял вопрос был в том, чтобы отобразить цвет с 8ми битной картинки (независимо от палитры) посредством этих трёх байт - красного, зелёного и синиго. Если так - то Picture1.Point

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 29.06.2007 (Пт) 17:39

На монитор вообще идут не байты, а напряжения.
На мой, по крайней мере. VGA -- аналоговый интерфейс.


Кстати, двухбитных картинок в винде афаик не бывает.
А вот одно- и четырёхбитные -- запросто. Их в твоём перечне нет ;-)
Изображение

nekeda
Постоялец
Постоялец
 
Сообщения: 710
Зарегистрирован: 10.04.2005 (Вс) 23:20

Сообщение nekeda » 29.06.2007 (Пт) 18:24

да, там двоечку надо заменить на еденичку))

StimorolD3DX
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 293
Зарегистрирован: 03.04.2007 (Вт) 18:19
Откуда: Kiev city

Сообщение StimorolD3DX » 01.07.2007 (Вс) 11:38

Вот случайно нашел:
Преобразование картинки из формата 8 бит (256 цветов) в 24 бит.
Код: Выделить всё
BOOL Convert256To24 (char *fin, char *fout)
{
     BITMAPFILEHEADER bfh;
     BITMAPINFOHEADER bih;
     int Width, Height;
     RGBQUAD Palette[256];
     BYTE *inBuf;
     RGBTRIPLE *outBuf;
     HANDLE hIn, hOut;
     DWORD RW;
     DWORD OffBits;
     int i, j;

     hIn = CreateFile (fin, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
     if (hIn == INVALID_HANDLE_VALUE)
         return FALSE;

     hOut = CreateFile (fout, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);
     if (hOut == INVALID_HANDLE_VALUE)
     {
         CloseHandle (hIn);
         return FALSE;
     }

     // Прочтем данные
     ReadFile (hIn, &bfh, sizeof(bfh), &RW, NULL);
     ReadFile (hIn, &bih, sizeof(bih), &RW, NULL);
     ReadFile (hIn, Palette, 256 * sizeof(RGBQUAD), &RW, NULL);

     // Установим указатель на начало растра
     SetFilePointer (hIn, bfh.bfOffBits, NULL, FILE_BEGIN);
     Width = bih.biWidth;
     Height = bih.biHeight;
     OffBits = bfh.bfOffBits;

     // Выделим память
     inBuf = new BYTE [Width];
     outBuf = new RGBTRIPLE [Width];

     // Заполним заголовки
     bfh.bfOffBits = sizeof (bfh) + sizeof (bih);                               // Не будем писать палитру
     bih.biBitCount = 24;
     bfh.bfSize = bfh.bfOffBits + 4 * Width * Height + Height * (Width % 4);    // Размер файла

     // А остальное не меняется
     // Запишем заголовки
     WriteFile (hOut, &bfh, sizeof(bfh), &RW, NULL);
     WriteFile (hOut, &bih, sizeof(bih), &RW, NULL);

     // Начнем преобразовывать
     for (i = 0; i < Height; i++)
     {
         ReadFile (hIn, inBuf, Width, &RW, NULL);
         for (j = 0; j < Width; j++)
         {
             outBuf[j].rgbtRed = Palette[inBuf[j]].rgbRed;
             outBuf[j].rgbtGreen = Palette[inBuf[j]].rgbGreen;
             outBuf[j].rgbtBlue = Palette[inBuf[j]].rgbBlue;
         }
         WriteFile (hOut, outBuf, sizeof(RGBTRIPLE) * Width, &RW, NULL);

         // Пишем мусор для выравнивания
         WriteFile (hOut, Palette, Width % 4, &RW, NULL);
         SetFilePointer (hIn, (3 * Width) % 4, NULL, FILE_CURRENT);
     }

     delete inBuf;
     delete outBuf;
     CloseHandle (hIn);
     CloseHandle (hOut);
     return TRUE;
}

Glyckmen
Обычный пользователь
Обычный пользователь
 
Сообщения: 72
Зарегистрирован: 30.04.2006 (Вс) 15:32
Откуда: Санкт-Петербург

Сообщение Glyckmen » 02.07.2007 (Пн) 15:49

А что за формат 8 бит, имеется ли в нем стандартный заголовок, что-бы PictureBox понял этот файл? Я имел дело с нестандартными цветами но они в восновном использовались в телефонах старых моделей или уж в совсем в древних компах (напр Samsung X100/X600) там мне пришлось расковырять прошивку, вытащить от туда графику и выяснить этот формат, цветность оказалась 16 бит (вся графика была без заголовков, приходилось опытным путем устанавливать размерность картинки), но вот дальше пошли непонятки, обычная графика имела такую раскладку 5 бит красный 6 бит синий 5 бит зеленый, а для графики которая использовалась в фото (рамки) имела другую раскладку 5 бит зеленый 6 бит синий 5 бит красный т.е. перевернутый. К чему я все это написал? Да к тому что надо знать формат где какие биты отвечают за тот или иной цвет (например: 3 бита красный 2 бита синий 3 бита зеленый = 8 бит), а разбить байт на биты не составляет труда. (Оператор AND тебе поможет) Далее надо будет произвести корректировку цветов (а то картинка будет темной) и дальше делай с этими цветами все что хочешь (есть куча фильтров реализованых на VB).

Если надо могу выслать тебе кусок кода на VB, где я работаю с 16 бит графикой по цветам.
Последний раз редактировалось Glyckmen 02.07.2007 (Пн) 15:55, всего редактировалось 1 раз.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 02.07.2007 (Пн) 15:51

8 бит -- это индексированный цвет (палитра)
Изображение


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 92

    TopList