Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Media";
Текущий архив: 2005.01.30;
Скачать: [xml.tar.bz2];

Вниз

Проблема с заданием палитры для 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 вся ветка

Форум: "Media";
Текущий архив: 2005.01.30;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.039 c
1-1105731289
Gear
2005-01-14 22:34
2005.01.30
Сравить два массива.


14-1105492871
aus
2005-01-12 04:21
2005.01.30
Антивирус


1-1105637174
redlord
2005-01-13 20:26
2005.01.30
проверка на наличие компонента созданного в рантайме


11-1088250642
help
2004-06-26 15:50
2005.01.30
KOLRarInfoBar вопрос к автору...


4-1102587212
Alexius
2004-12-09 13:13
2005.01.30
Как узнать, какая программа обращается к COM порту?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский