Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.01.30;
Скачать: CL | DM;

Вниз

Проблема с заданием палитры для pf1bit   Найти похожие ветки 

 
Mihey_temporary ©   (2004-10-09 20:49) [0]

Работаю над загрузкой иконок. Вот кусок кода, с помощью которого загружаю AND маску.



var FS: TFileStream;
   BitmapInfoHeader: TBitmapInfoHeader;
   BitmapInfo: TBitmapInfo;
   BitmapBits: Pointer;
   PalCount: Integer;
   IconPalette: PLogPalette;
   i, k: Integer;
   Ahdc: HDC;

      IconAndBitmaps[i] := TBitmap.Create;

      BitmapInfoHeader.biBitCount := 1;
      BitmapInfo.bmiHeader := BitmapInfoHeader;

      IconAndBitmaps[i].Handle := CreateDIBSection(
        Ahdc, BitmapInfo, DIB_RGB_COLORS, BitmapBits, 0, 0);

      FS.Read(BitmapBits^, BitmapInfoHeader.biHeight *
        (BytesPerScanline(BitmapInfoHeader.biWidth,
        BitmapInfoHeader.biBitCount, 32)));

      GetMem(IconPalette, SizeOf(TLogPalette)
             + SizeOf(TPaletteEntry) * 2);

      IconPalette.palVersion := $300;
      IconPalette.palNumEntries := 2;

      for k := 0 to 1 do
       begin
         IconPalette.palPalEntry[k].peRed := (k * 255);
         IconPalette.palPalEntry[k].peGreen := (k * 255);
         IconPalette.palPalEntry[k].peBlue := (k * 255);
         IconPalette.palPalEntry[k].peFlags := 0;
       end;

      IconAndBitmaps[i].Palette := CreatePalette(IconPalette^);
      FreeMem(IconPalette);


Проблема в том, что первоначально, без задания палитры для pf1bit, маска рисовалась в тёмно-синем и синем цветах (сегодня, вчера - в багровых). Я хотел задать строго чёрно-белую палитру так, как показано в коде. Но в результате выводится просто чёрное изображение.

Также если сначала задать палитру, а потом считать биты, то на одном из изображений подвисает (без всяких исключений).

И ещё, кто разбирается - я вообще в принципе правильно делаю?


 
Fenik   (2004-10-10 11:56) [1]

Попробуй
IconPalette.palPalEntry[k].peFlags := PC_NOCOLLAPSE;

флага 0 по-моему нет.


 
Mihey_temporary ©   (2004-10-10 13:21) [2]

Не помогло. Кроме того, раньше я использовал peFlags := 0 и пахало, но тогда TBitmap создавался обычными способами и биты считывались через Scanline.


 
Mihey_temporary ©   (2004-10-10 13:42) [3]

http://delphibase.endimus.ru


 
Mihey_temporary ©   (2004-10-10 13:42) [4]

Промахнулся!


 
Fenik   (2004-10-10 15:55) [5]

Возможно имеет смысл полность заполнить BitmapInfoHeader?

 with BitmapInfoHeader do
 begin
   biSize := SizeOf(TBitmapInfoHeader);
   biPlanes := 1;
   biBitCount := 1;
   biCompression := BI_RGB;
   biWidth := Width;
   biHeight := Height;
   biSizeImage := 0;
   biXPelsPerMeter := 0;
   biYPelsPerMeter := 0;
   biClrUsed := 0;
   biClrImportant := 0;
 end;

А в чем действительно трабл, не знаю. Я с API покачто "на вы".


 
Mihey_temporary ©   (2004-10-10 19:46) [6]

Нет, безрезультатно.
Что-то я отчаялся что-либо сделать...
Может кто побачит исходники всего процесса?
http://www.hot.ee/mvps12/IconLoad.rar

(по щелчку на форме выводятся два изображения - XOR и AND маски)


 
Fenik   (2004-10-11 22:41) [7]

> Mihey_temporary ©

Отправил тебе (на михей77) кое-что давно нарытое в инете. Посмотри, авось поможет.


 
Fenik   (2004-10-13 20:56) [8]

Что, не помогло?


 
Mihey_temporary ©   (2004-10-13 21:59) [9]

Я получил, разбираюсь. Там дело в том, что нужно всё заново переделывать. Там походу создают TBitmap как обычно и рисуют на нём иконку. Я так и сделаю, но нужно время. И также хочется разобраться с этим делом - всё таки, изображение же загрузилось, а вот что с палитрой - ???


 
Fenik   (2004-10-14 22:11) [10]

Ну вот и загружай в обычный битмап. Затем PixelFormat := pf1Bit;
А потом присваивай свою палитру.


 
Mihey_temporary ©   (2004-10-17 00:19) [11]

Решил это дело немного подругому. Палитру я не создаю, а меняю color table.

 
 for k := 0 to 1 do
   with ColorTable[k] do
      begin
         rgbBlue     := k*255;
         rgbGreen    := k*255;
         rgbRed      := k*255;
         rgbReserved := 0;
      end;

 SetDIBColorTable(IconAndBitmaps[i].Canvas.Handle, 0, 2, ColorTable);


С одной стороны это логично, ведь DIB"ы обращаются к color table, а не палитре. С другой стороны, непонятно, как присвоение палитры тогда что-то меняло и что же теперь - палитру не использовать, что ли?


 
Fenik   (2004-10-17 13:41) [12]

> Mihey_temporary ©  (17.10.04 00:19) [11]
> Палитру я не создаю, а меняю color table.
...
>С одной стороны это логично, ведь DIB"ы обращаются к color table, а не палитре.


Так ведь цветовая таблица - это и есть палитра.
Или я чего-то не понимаю?


 
Mihey_temporary ©   (2004-10-17 16:21) [13]


> Так ведь цветовая таблица - это и есть палитра.
> Или я чего-то не понимаю?


Ну не совсем. Для DIB на основе палитры (HPALETTE) должна создаваться цветовая таблица. Что-то в этом механизме внутри TBitmap не сработало.



Страницы: 1 вся ветка

Текущий архив: 2005.01.30;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.055 c
6-1100412396
focor
2004-11-14 09:06
2005.01.30
HTML_API


10-1082532514
DinoRay
2004-04-21 11:28
2005.01.30
События ActiveX


1-1106222018
Degobar
2005-01-20 14:53
2005.01.30
Можно ли скопировать облать из wmf файла в bitmap


3-1103875805
AlexAndreev
2004-12-24 11:10
2005.01.30
Есть DbGrid и DbMemo


8-1098346166
Ricko
2004-10-21 12:09
2005.01.30
Как перенаправить сигнал со входа звуковой карты на выход?