![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с заданием палитры для pf1bit [D5, Win95/98]
Mihey_temporary © (2004-10-09 20:49:00)Работаю над загрузкой иконок. Вот кусок кода, с помощью которого загружаю 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, маска рисовалась в тёмно-синем и синем цветах (сегодня, вчера - в багровых). Я хотел задать строго чёрно-белую палитру так, как показано в коде. Но в результате выводится просто чёрное изображение.
Также если сначала задать палитру, а потом считать биты, то на одном из изображений подвисает (без всяких исключений).
И ещё, кто разбирается - я вообще в принципе правильно делаю?
Mihey_temporary (2004-10-17 16:21:00) [1]
> Так ведь цветовая таблица - это и есть палитра.
> Или я чего-то не понимаю?
Ну не совсем. Для DIB на основе палитры (HPALETTE) должна создаваться цветовая таблица. Что-то в этом механизме внутри TBitmap не сработало.
Fenik (2004-10-17 13:41:00) [2]> Mihey_temporary © (17.10.04 00:19) [11]
> Палитру я не создаю, а меняю color table.
...
>С одной стороны это логично, ведь DIB'ы обращаются к color table, а не палитре.
Так ведь цветовая таблица - это и есть палитра.
Или я чего-то не понимаю?
Mihey_temporary (2004-10-17 00:19:00) [3]Решил это дело немного подругому. Палитру я не создаю, а меняю 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-14 22:11:00) [4]Ну вот и загружай в обычный битмап. Затем PixelFormat := pf1Bit;
А потом присваивай свою палитру.
Mihey_temporary (2004-10-13 21:59:00) [5]Я получил, разбираюсь. Там дело в том, что нужно всё заново переделывать. Там походу создают TBitmap как обычно и рисуют на нём иконку. Я так и сделаю, но нужно время. И также хочется разобраться с этим делом - всё таки, изображение же загрузилось, а вот что с палитрой - ???
Fenik (2004-10-13 20:56:00) [6]Что, не помогло?
Fenik (2004-10-11 22:41:00) [7]> Mihey_temporary ©
Отправил тебе (на михей77) кое-что давно нарытое в инете. Посмотри, авось поможет.
Mihey_temporary (2004-10-10 19:46:00) [8]Нет, безрезультатно.
Что-то я отчаялся что-либо сделать...
Может кто побачит исходники всего процесса?
http://www.hot.ee/mvps12/IconLoad.rar
(по щелчку на форме выводятся два изображения - XOR и AND маски)
Fenik (2004-10-10 15:55:00) [9]Возможно имеет смысл полность заполнить 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 13:42:00) [10]http://delphibase.endimus.ru
Mihey_temporary (2004-10-10 13:42:00) [11]Промахнулся!
Mihey_temporary (2004-10-10 13:21:00) [12]Не помогло. Кроме того, раньше я использовал peFlags := 0 и пахало, но тогда TBitmap создавался обычными способами и биты считывались через Scanline.
Fenik (2004-10-10 11:56:00) [13]Попробуй
IconPalette.palPalEntry[k].peFlags := PC_NOCOLLAPSE;
флага 0 по-моему нет.