Форум: "Начинающим";
Текущий архив: 2013.06.02;
Скачать: [xml.tar.bz2];
ВнизФункция CreateDIBSection Не создается палитра??? Найти похожие ветки
← →
Сергей (2012-10-30 13:27) [0]подскажите плз, что я пропустил в этой процедуре, почему не создается палитра?
procedure TForm1.Button2Click(Sender: TObject);
var
BInfo: TBITMAPINFO; //заголовок
bmp:Graphics.TBitmap;
i:byte;
GetDIBPointer:Pointer;
begin
with Binfo.bmiHeader do
begin
biBitCount:=8;
biWidth:=300;
biHeight:=300;
biPlanes:=1;
biSize:=sizeof (BITMAPINFOHEADER);
biCompression:=0;
biSizeImage:=90000;
biXPelsPerMeter:=0;
biYPelsPerMeter:=0;
biClrImportant:=0;
biClrUsed:=0;
end;
for i:=0 to 255 do
begin
Binfo.bmiColors[i].rgbReserved:=0;
Binfo.bmiColors[i].rgbRed:=i;
Binfo.bmiColors[i].rgbGreen:=i;
Binfo.bmiColors[i].rgbBlue:=i;
end;
bmp:= Graphics.TBitmap.Create;
bmp.Handle:= CreateDIBSection(bmp.Canvas.Handle, BInfo, DIB_RGB_COLORS, GetDIBPointer, 0, 0);
showmessage("Хэндл картинки "+inttostr(bmp.Handle));
showmessage("Палитра "+inttostr(bmp.Palette));
end;
P.S. FPC 2.6.1 Lazarus 1.1
← →
MBo © (2012-10-30 14:06) [1]Логическая палитра при такой операции не создается.
Ее можно построить вручную или функцией PaletteFromDIBColorTable из Graphics.
А зачем понадобилась палитра?
← →
Сергей (2012-10-30 14:14) [2]насколько понимаю, 8-ми битных bmp-шек без палитры не бывает. ;)
Нужно создать и сохранить рисунок в оттенках серого (размер критичен)
← →
Сергей (2012-10-30 14:32) [3]создал палитру так: все равно палитры нет
GetMem(Pal,sizeof(PLogPalette)+256*sizeof(TPaletteEntry));
for i:=0 to 255 do
begin
Pal^.palPalEntry[i].peBlue:=i;
Pal^.palPalEntry[i].peGreen:=i;
Pal^.palPalEntry[i].peRed:=i;
Pal^.palPalEntry[i].peFlags:=0;
end;
Pal^.palVersion:=$300;
Pal^.palNumEntries:=256;
bmp:= Graphics.TBitmap.Create;
bmp.Handle:= CreateDIBSection(bmp.Canvas.Handle, BInfo, DIB_RGB_COLORS, GetDIBPointer, 0, 0);
bmp.Palette:=CreatePalette(Pal^);
← →
icWasya © (2012-10-30 15:00) [4]biClrUsed:=256; - не?
← →
Сергей (2012-10-30 15:08) [5]пробовал, не.
← →
MBo © (2012-10-30 17:37) [6]>насколько понимаю, 8-ми битных bmp-шек без палитры не бывает. ;)
>Нужно создать и сохранить рисунок в оттенках серого (размер критичен)
Это не значит, что должен существовать GDI-объект палитры.
Создать битмап.
Задать ему pixeformat pf8bit. При этом битмап станет DIB.
Создать таблицу цветов array[byte] of TRGBQuad, заполнить её, и сделать SetDIBColorTable
Вот, кажется, и все шаги для создания битмапа в оттенках серого
← →
Сергей (2012-10-30 22:57) [7]Дома поставил delphi7, проверил свой вариант и Ваш, который Вы описали на http://www.delphimaster.net/view/1-51738, палитра создалась в обоих вариантах.
А в Free Pascal - ни в какую, причем если 8 битное изображение сохранить, получается не 8 битное, а 24-битное, видимо работа с палитрами не поддерживается.
← →
SergeyIT © (2012-10-31 19:05) [8]Тогда может самому файл писать, там простой формат.
А если прочитать файл с палитрой, нормально грузится?
← →
Сергей (2012-11-01 11:34) [9]Грузится нормально и сохраняется тоже, но глубина цвета не меняется 1.bmp - 8 битный, результирующий 2.bmp тоже, несмотря на
b1.PixelFormat:=pf24bit;
PixelFormat не влияет ни на что, наверно здесь какие-то другие методы искать нужноb, b1:Tbitmap;
begin
b:=Tbitmap.Create;
b1:=Tbitmap.Create;
b1.PixelFormat:=pf24bit;
b.LoadFromFile("d:\1.bmp");
b1.Assign(b);
b1.SaveToFile("d:\2.bmp");
end;
← →
SergeyIT © (2012-11-01 12:21) [10]Так вроде
b.LoadFromFile("d:\1.bmp");
Отменяет действие b1.PixelFormat:=pf24bit; и устанавливает формат из файла... или я не прав
← →
Сергей (2012-11-01 13:34) [11]
var b, b1:Tbitmap;
begin
b:=Tbitmap.Create;
b1:=Tbitmap.Create;
b.LoadFromFile("d:\1.bmp");
b1.Assign(b);
b1.PixelFormat:=pf24bit;
b1.SaveToFile("d:\2.bmp");
end;
от перестановки ничего не меняется
← →
Сергей (2012-11-01 13:35) [12]Ладно, черт с ним, уже в Delphi сделал все, что было нужно.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2013.06.02;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.003 c