Wątek przeniesiony 2015-11-25 18:16 z Newbie przez furious programming.

Ilu bitowa jest bitmapa - PixelFormat

0

Witajcie.

Chciałbym się zwrócić do was z prośbą o podpowiedź w rozwiązaniu następującego problemu.

Potrzebuję uzyskać informacje ilu bitowa jest bitmapa, która jest wczytana na mój Image. Na forum znalazłem coś takiego jak PixelFormat jednak po zastosowaniu takiego kodu:

   if Image1.Picture.Bitmap.PixelFormat=pf24bit then
     ShowMessage('24 bitowa');
   if Image1.Picture.Bitmap.PixelFormat=pf16bit then
     ShowMessage('16 bitowa');
    if Image1.Picture.Bitmap.PixelFormat=pf32bit then
     ShowMessage('32 bitowa'); 

nie jest zwracana poprawna wartość. Skąd to wiem... Gdy zapisze bitmape do pliku i sprawdzę jego właściwości (w windowsie) pokazuje Głębia w bitach: 24. Co ciekawe po zapisaniu do pliku i ponownym odpaleniu mojego kodu sprawdzającego ile bitów ma bitmapa wynik jest poprawny.

Gdzie tkwi problem? Jak zrobić aby dostać poprawną informacje o bitmapie?

  • Jeżeli chodzi o kontekst to stosuje filtry przetwarzania obrazu gdzie za pomocą ScanLine i wskaźników sczytuję kolejne bajty i składam to do kupy funkcją RGB. Co za tym idzie poprawna informacja z jaką bitmapą mam do czynienia jest niezbędna, aby poprawnie przetworzyć obraz. PixelFormat wyświetla poprawie informacje do momentu aż zacznę stosować filtry. *
1

Jeżeli właściwość PixelFormat podaje nieprawidłową wartość to zawsze możesz ręcznie sprawdzić taką informację; Do dyspozycji masz właściwość Image.Picture.Bitmap.RawImage[#]_ z nieobrobionym obrazem, wystarczy tylko sprawdzić w specyfikacji formatu na którym bajcie leży flaga biBitCount i ją odczytać;

.. [#] Sam nie używałem jeszcze tej właściwości, ale to znalazłem w Google i na tym bym się skupił.

0

Gdy zapisze bitmape do pliku i sprawdzę jego właściwości (w windowsie) pokazuje Głębia w bitach: 24

A jesteś pewien że okno własciwości z Windowsa pokazuje poprawnie?

0
type
  TBMPFileHeader = packed record  // Nagłowek pliku BMP.
    bfType      : Word;
    bfSize      : LongWord;
    bfReserved1 : Word;
    bfReserved2 : Word;
    bfOffBits   : DWord;
  end;

type
  TBMPImageHeader = packed record // Nagłówek obrazu BMP.
    biSize           : LongWord;
    biWidth          : LongInt;
    biHeight         : LongInt;
    biPlanes         : Word;
    biBitCount       : Word;
    biCompression    : LongWord;
    biImageSize      : LongWord;
    biXPelsPerMetter : LongInt;
    biYPelsPerMetter : LongInt;
    biClrUsed        : LongWord;
    biClrImportant   : LongWord;
  end;

Najpierw jest nagłówek pliku potem nagłówek bmp. Można to skrócić do:

type
  TBMPHeader = packed record // Nagłówek obrazu BMP.
    bfType      : Word;
    bfSize      : LongWord;
    bfReserved1 : Word;
    bfReserved2 : Word;
    bfOffBits   : DWord;
    biSize           : LongWord;
    biWidth          : LongInt;
    biHeight         : LongInt;
    biPlanes         : Word;
    biBitCount       : Word;
    biCompression    : LongWord;
    biImageSize      : LongWord;
    biXPelsPerMetter : LongInt;
    biYPelsPerMetter : LongInt;
    biClrUsed        : LongWord;
    biClrImportant   : LongWord;
  end;

Ciebie interesuje biBitCount : Word; Wczytaj sobie to z pliku.

0

Dziękuje za odpowiedzi.

Sporo przeglądałem już materiałów rozumiem, że muszę odczytać dane z nagłówka ZDJECIE

Do dyspozycji masz właściwość Image.Picture.Bitmap.RawImage1 z nieobrobionym obrazem, wystarczy tylko sprawdzić w specyfikacji formatu na którym bajcie leży flaga biBitCount i ją odczytać;

Jeżeli dobrze zrozumiałem potrzebuje ustawić wskaźnik na RawImage i dostać się do potrzebnej informacji jednak nie mam pojęcia jak w tym wypadku ma to wylądować.

Azarien - tak jestem pewien, wynika to z tego że mam dwie procedury, które są przystosowane do obróbki obrazu 24 bitowego i 32 bitowego i wywołując procedurę widzę czy się zgadza.

babubabu - widziałem już gdzieś ten sposób, jednak podobnie jak wyżej nie wiem jak to sczytać

0

@waskadr - jeżeli o ten rysunek chodzi, to potrzebujesz pobrać wartość Bits per Pixel; Jak znajdę chwilę to postaram się podać kod (dla Lazarusa).

2

Normalnie:

function LoadBMPFileHeader(FileName : string) : TBMPHeader;
var
  BMPFile   : TFileStream;
begin
  BMPFile := TFileStream.Create(Filename, fmOpenRead);
  try
    BMPFile.ReadBuffer(result, SizeOf(result));
  finally
    FreeAndNil(BMPFile);
  end;
end;

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