Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Графика и игры
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 07.03.2017, 20:51
Аватар для SCrat.ORS
SCrat.ORS SCrat.ORS вне форума
Активный
 
Регистрация: 20.02.2007
Адрес: Мой адрес не дом и не улица, мой адрес 0x7С00
Сообщения: 208
Версия Delphi: 2006
Репутация: 884
По умолчанию

Нет, CreateCompatibleBitmap создает на основе контекста, а контекст 32 битый, а значит что битмап на выходе будет 32 битный, а мне нужен 4 битный. В этом и прикол. В итоге мне удалось реализовать задуманное через CreateDIBSelection.

Если вдруг кому понадобится:
Что нам надо,
1. Переменную структуры BITMAPINFO, в которой опишем нужный нам формат битмапа.
2. Переменную Pointer, что бы знать куда писать данные.
3. Массив с палитрой типа RGBQUAD.
4. Собственно данные.

Код:
var
ImgBitInfo:BITMAPINFO; //Описание битмапа
hDC:LongWord;             //Контекст
BufferedImage:LongWord;  // Битмап
PImgArrayPix: Array [0..7] of Integer;  //Массив данных
//можно брать 4 byte на строчку из 8 px, но это равносильно 1 integer
i,color:Integer;  //Переменки
PbyteArray:Pointer;  //Указатель на память 
Palletes:array [0..3] of RGBQUAD; //Палитра

begin
//Заполняем структуру
with ImgBitInfo.bmiHeader do
 begin
  biSize:=sizeof(ImgBitInfo.bmiHeader);
  biWidth:=8; //размер картинки 8 px
  biHeight:=8;//размер картинки 8 px
  biPlanes:=1; //Всегда 1
  biBitCount:=4;
 //4 бита на пиксель, палитра 16 цветов, индексированные цвета
  biCompression:=0; //без компрессии
  biClrUsed:=4; //используем только 4 цвета
end;
 //Создаем Битмап, точнее область в памяти
 // с DIB данными с заданными параметрами
  BufferedImage :=CreateDIBSection(DC,ImgBitInfo,0,PbyteArray,0,0);
//теперь PbyteArray - это указатель на адрес памяти где лежат данные DIB
  //Создаем контекст
  hdc           :=CreateCompatibleDC(DC);
 //Выбираем это хозяйство
  SelectObject(hdc, BufferedImage);

//Заполняем палитру нужными цветами
   for i := 0 to 3 do
   begin
    color:=NesColor[palettes[Palette,0,i]]; //Каким угодно образом 
    Palletes[i].rgbRed  := GetRValue(color);//заполняем палитру
    Palletes[i].rgbGreen:= GetGValue(color);//
    Palletes[i].rgbBlue := GetBValue(color);//
   end;
  SetDIBColorTable(hDC,0,4,Palletes); //Применяем палитру к контексту
// 0 - первый индекс цвета, 4 - количество цветов

//Заполняем массив данных, читаем его или подготавливаем заранее
  for i := 0 to 7 do PImgArrayPix[7-i]:=bit2Int(maps_Tables[Mapper,code,0, i],maps_Tables[Mapper,code,1,i]);
//Заполняется снизу вверх

//Копируем все данные массива, в адрес полученный ранее
CopyMemory(PbyteArray, @PImgArrayPix, 32);


//Выводим полученное изображение куда надо, 
 TransparentBlt(dc,x,y,8,8,hdc,0,0,8,8,NesColor[palettes[Palette,0,0]]);//с прозрачностью
 //BitBLT(DC,x,y,x+8,y+8,hdc,0,0,SRCCOPY); //или без

//Удаляем переменные.
  ReleaseDC(hDC,BufferedImage);
  DeleteDC(hDC);
  DeleteObject(BufferedImage);
end;
__________________
Програмистами не рождаются, ими становятся!

Последний раз редактировалось SCrat.ORS, 08.03.2017 в 10:55.
Ответить с цитированием
Этот пользователь сказал Спасибо SCrat.ORS за это полезное сообщение:
IvoX (22.05.2019)
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

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

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 03:35.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2026