Bitmap Всегда сохраняет в 24 битном формате. Баг?

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Bitmap Всегда сохраняет в 24 битном формате. Баг?

Сообщение vitaly_l » 11.01.2015 20:10:11

Всем привет,

Код: Выделить всё
    Bitmap.PixelFormat := pf8bit; //  либо pf16bit, либо любой иной
    Bitmap.SetSize(Width,Height);
    Bitmap.SaveToFile('8bit.bmp'); 


:arrow: Всегда сохраняет в 24 битном формате. Почему? :cry:


.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Bitmap Всегда сохраняет в 24 битном формате. Баг?

Сообщение Alex2013 » 12.01.2015 17:19:10

Может при создании нужно устанавливать нужный флаг ?
(Пока он пуст)
Bitmap:=Bitmap.Create:
Bitmap.PixelFormat := pf8bit;
Bitmap.Assign(WorkBitmap);
Bitmap.SaveToFile('8bit.bmp');
Bitmap.free;
Последний раз редактировалось Alex2013 12.01.2015 17:41:38, всего редактировалось 1 раз.
Alex2013
долгожитель
 
Сообщения: 3145
Зарегистрирован: 03.04.2013 11:59:44

Re: Bitmap Всегда сохраняет в 24 битном формате. Баг?

Сообщение vitaly_l » 12.01.2015 17:27:19

Так я для этого и пытался установить 16 бит или 8 бит.
Вот код:
Код: Выделить всё
function ConvertTo16Bit(aValue: TBitmap): TBitmap;
begin
  Result := TBitmap.Create;
  with Result do
    if aValue.PixelFormat <> pf16bit then
      begin
        PixelFormat := pf16bit;
        SetSize(aValue.Width,aValue.Height);
        Canvas.Draw(0,0,aValue);
      end
    else
      Assign(AValue);
end;


А при сохранении всегда получается 24 бита ((((


.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Bitmap Всегда сохраняет в 24 битном формате. Баг?

Сообщение Alex2013 » 12.01.2015 17:48:56

http://wiki.freepascal.org/BGRABitmap ?
И ведь точно сам сталкивался ... но увы не помню как победил ... :roll:
Alex2013
долгожитель
 
Сообщения: 3145
Зарегистрирован: 03.04.2013 11:59:44

Re: Bitmap Всегда сохраняет в 24 битном формате. Баг?

Сообщение vitaly_l » 12.01.2015 18:01:41

У BGRABitmap нет возможности сделать "LoadFromClipboardFormat".
А равно там отсутствует и Bitmap.Handle или возможность подгрузить HBITMAP.
TLazIntfImage - подгружает HBITMAP дольше чем TBitmap...

В общем засада... TBitmap - делает всё что нужно, но не хочет менять формат.

сейчас попробую вот таким путём задать, может начнёт сохранять с 4-8-16 битным форматированием:
Код: Выделить всё
procedure TMBitmap.Allocate(SX, SY: integer);
var
  DC: HDC;
begin
  if BM <> 0 then
    DeleteObject(BM); {удаляем старый битмэп, если был}
  BM := 0;
  PB := nil;
  fillchar(BI, sizeof(BI), 0);
  with BI.bmiHeader do {заполняем структуру с параметрами битмэпа}
  begin
    biSize := sizeof(BI.bmiHeader);
    biWidth := SX;
    biHeight := SY;
    biPlanes := 1;
    biBitCount := 24;
    biCompression := BI_RGB;
    biSizeImage := 0;
    biXPelsPerMeter := 0;
    biYPelsPerMeter := 0;
    biClrUsed := 0;
    biClrImportant := 0;

    FLineSize := (biWidth + 1) * 3 and (-1 shl 2);
      {размер строки(кратна 4 байтам)}

    if (biWidth or biHeight) <> 0 then
    begin
      DC := CreateDC('DISPLAY', nil, nil, nil);
      {замечательная функция (см.HELP), возвращает HBITMAP, позволяет сразу
      разместить выделяемый битмэп в спроецированном файле, что позволяет
      ускорять работу и экономить память при генерировании большого битмэпа}
      {!} BM := CreateDIBSection(DC, BI, DIB_RGB_COLORS, pointer(PB), nil, 0);
      DeleteDC(DC); {в PB получаем указатель на битмэп-----^^}
      if BM = 0 then
        Error('error creating DIB');
    end;
  end;
end;


Но вообще по моему это страшный и коварный баг сидит в TBitmap



.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Bitmap Всегда сохраняет в 24 битном формате. Баг?

Сообщение Alex2013 » 12.01.2015 18:30:31

http://www.efg2.com/Lab/ImageProcessing/Scanline.htm :?:
Брр...
Короче видимо проще самостоятельно конвертировать ...
ЗЫ
Мысль :idea:
А что будет если загрузить 8бит картинку заранее :?:
(И уже по ней рисовать )
Alex2013
долгожитель
 
Сообщения: 3145
Зарегистрирован: 03.04.2013 11:59:44

Re: Bitmap Всегда сохраняет в 24 битном формате. Баг?

Сообщение vitaly_l » 12.01.2015 18:55:38

Alex2013 писал(а):http://www.efg2.com/Lab/ImageProcessing/Scanline.htm

проблема не в конвертации, он даже 4-8-16 бит созданную картинку - отказывается сохранить в 4-8-16 бит,
и всегда сохраняет как 24 бита...
Alex2013 писал(а):А что будет если загрузить 8бит картинку заранее
(И уже по ней рисовать )

Это безусловно забавный костыль, но по моему должно работать и без "загрузить 8бит картинку".
Либо я что-то делаю неправильно, либо в TBitmap - страшный и коварный баг, который всегда сохраняет только 24 bit файлы.


.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Bitmap Всегда сохраняет в 24 битном формате. Баг?

Сообщение kazalex » 12.01.2015 20:29:49

vitaly_l
vitaly_l писал(а):Либо я что-то делаю неправильно, либо в TBitmap - страшный и коварный баг, который всегда сохраняет только 24 bit файлы.

Ты ни при чем :) Просто в виджетсете для Win32 так реализован метод RawImage_QueryDescription. Вряд ли это баг, скорее недоделка. Вот в виджетсете для GTK2 сохранить 8-битный битмап вообще нельзя, т.к:
Код: Выделить всё
  if riqfPalette in AFlags then
  begin
    DebugLn('TGtk2WidgetSet.RawImage_QueryDescription: riqfPalette not (yet) supported');
    Exit(False);
  end;
kazalex
постоялец
 
Сообщения: 296
Зарегистрирован: 01.06.2012 14:54:10

Re: Bitmap Всегда сохраняет в 24 битном формате. Баг?

Сообщение vitaly_l » 12.01.2015 20:39:00

kazalex писал(а):Вряд ли это баг, скорее недоделка


И pf1bit тоже нельзя?...
И pf8bit тоже нельзя...
И pf16bit тоже нельзя...
Только pf24bit можно?
:arrow: Засада... в смысле оч. обидно :cry: и досадно...
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Bitmap Всегда сохраняет в 24 битном формате. Баг?

Сообщение kazalex » 12.01.2015 20:49:08

vitaly_l писал(а):Только pf24bit можно?

У меня сейчас лазаря под виндами нет, но судя по коду выходит именно так.
kazalex
постоялец
 
Сообщения: 296
Зарегистрирован: 01.06.2012 14:54:10

Re: Bitmap Всегда сохраняет в 24 битном формате. Баг?

Сообщение vitaly_l » 12.01.2015 21:02:28

Не....
что-то не то... загрузил 8 битную картинку, обаботал и пересохранил.
Всё сохранилось в 8 битах, соответственно я что-то неправильно делаю.
Например возможно для 8 бит нужно создать палитру?
Но тогда почему не работает 16 бит???

Засада...

:?: Есть кто нить кто, реально умеет работать с 8 и 1 битными bitmap :cry: СОЗДАННЫМИ В ЛАЗАРУСЕ?

.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Bitmap Всегда сохраняет в 24 битном формате. Баг?

Сообщение kazalex » 12.01.2015 21:08:21

vitaly_l писал(а):что-то не то... загрузил 8 битную картинку, обаботал и пересохранил.
Всё сохранилось в 8 битах, соответственно я что-то неправильно делаю.

Потому что RawImage_QueryDescription вызывается только при создании новых битмапов.
kazalex
постоялец
 
Сообщения: 296
Зарегистрирован: 01.06.2012 14:54:10

Re: Bitmap Всегда сохраняет в 24 битном формате. Баг?

Сообщение vitaly_l » 12.01.2015 21:33:20

Alex2013 писал(а):А что будет если загрузить 8бит картинку заранее
(И уже по ней рисовать )

Соответственно только так(загружая шаблон) можно работать с 8 битным форматом...
ыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыы :x :cry:

.

Добавлено спустя 1 час 9 минут 14 секунд:
Даже так не хочет работать...
Если загрузить в битмап картинку в градации серого 8 бит.
И сказать "ей" Canvas.Draw(0,0,aBitmap); где aBitmap в 24 битном формате, то
она автоматом превращается в 24 битную...

если же её сканлайном попытаться зарисовывать, то на ней ничего не рисуется...
Есть подозрение что я всё таки, что-то неправильно делаю...
т.к. загруженную 8 битную картинку она пересохраняет нормально.


.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 239

Рейтинг@Mail.ru
cron