Zły TPixelFormat w TBitmap pod Lazarusem

0

Witam
Piszę aplikację w Lazarusie, ma ona polegać na podmiance LSB. Myślałem, że pójdzie jak z płatka, ale niestety taki kod:

procedure TForm1.ButtonLoadBMPClick(Sender: TObject);
const
  PixelName: array [TPixelFormat] of string = (
    'Device', '1-bit', '4-bit', '8-bit', '15-bit', '16-bit',
    '24-bit', '32-bit', 'Custom');
begin
  OpenPictureDialog1.Execute;
  Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName);
  Memo1.Lines.Add(PixelName[Image1.Picture.Bitmap.PixelFormat]);
end;

Pod Delphi 7 zwraca poprawne informacje zależnie od bitmapy (sprawdzałem te które można zapisać "Paint"em). Jednak pod Lazarusem 1.2.4 ten sam kod rozpoznaje tylko monochromatyczne bitmapy a pozostałe traktuje jako 24-bit i nie wiem teraz czy bitmapa ma paletę czy nie.
ImageMain.Picture.Bitmap.RawImage.Description.AsString Też nie rozróżnia bitmap.

Czy jest możliwość dobrania się do tych informacji bez niskopoziomowego babrania się z formatem BMP lub doinstalowywania innych pakietów/bibliotek?

0

akurat dużo babrania się nie masz - to tylko odczytanie jednego bajta ze stałej pozycji

0

Po to chciałbym sięgnąć w ostateczności jeśli nie będzie innej możliwości, bo wiąże się to z niepotrzebnym ponownym otwarciem pliku.

0

Spróbuj załadować do TBitmap, z niej wczytać PixelFormat (ewentualnie Image1.Picture.Assign(Bmp) )
Pamiętaj że TGraphic mówi ci o bitmapie w pamięci a nie o tej na dysku.

0

Niestety ten sam efekt, 16-kolorową bitpmapę z paletą pokazuje jako '24-bit'

0

Więc zapisz do innego pliku i zobacz co się zapisze.
Zauważ że przy tworzeniu bitmapy jest sprawdzenie na IsCompatible - czyli instancja bitmapy musi być kompatybilna z systemem.

0

Po zapisie jeśli jej nie zmodyfikuje jest identyczna z oryginałem (porównałem pod hexedytorem), natomiast jeśli zmienię kolor 1 pixel'a to plik zmienia się całkowicie i zapisuje jako 24-bitową bitmapę. Używam klasy TBitmap z modułu Graphics. Nie rozumiem tej informacji o IsCompatible gdzie to jest i czy da się to zmienić?

0

Zmianę odradzam, (no chyba że zgłosisz wraz z rozwiązaniem - wszak to Open Source), obejrzyj kod LCL.
Którą wersje LCL używasz?

1 użytkowników online, w tym zalogowanych: 0, gości: 1