Форум: "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