Тема: 4 bit HBitmap
Показать сообщение отдельно
  #3  
Старый 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;
__________________
Програмистами не рождаются, ими становятся!
Ответить с цитированием