![]() |
Korrekte biSizeImage?
Habe wieder mal ein kleines Problem.
Vorher habe ich die Größe auf dieser weise übergeben. Width * Height * 3 Dann habe ich aber Fehler im Bitmap. Habe jetzt eine Lösung im Net gefunden welche die korrekt Größe liefern sollte. Tut sie aber nicht Bild ist immer noch Fehlerhaft. Wie ist denn nun die korrekte Formel um biSizeImage auf die korrekte Größe zu setzen.? Das war die Lösung aus dem Net.
Delphi-Quellcode:
function ByteAlignOnWord(BitDepth: Byte; Width: Integer): DWord;
begin Result := (((Width * BitDepth) + $1F) And Not $1F) div $8; end;
Delphi-Quellcode:
EDIT:
bi.bmiHeader.biSizeImage := DWord(Abs(bi.bmiHeader.biHeight)) *
ByteAlignOnWord(Byte(bi.bmiHeader.biBitCount), bi.bmiHeader.biWidth); Den schrägen strich habe ich behoben , es fehlte bei Width das - 1 Für das anderen Problem habe ich noch einen Shot hochgeladen. gruss |
AW: Korrekte biSizeImage?
Ich habe es jetzt erstmal so behoben das ich mein Fenster einfach 2 Pixel runterschiebe dann sieht man den Fehler nicht.
Schade das da niemand bescheid weis. :| gruss |
AW: Korrekte biSizeImage?
Zitat:
Erfahrungsgemäß ist das Forum dann nicht so gut besucht. Und jetzt kommt dann auch noch das Wochenende. Warte einfach noch ein wenig ab :wink: |
AW: Korrekte biSizeImage?
Zitat:
gruss |
AW: Korrekte biSizeImage?
Hallo,
darauf bezieht sich ja dein Code ![]() Darüber steht auch noch ein Kommentar zur RLE-Kompression, aber weiter kann ich dir leider auch nicht helfen. Wobei ((pbmi->bmiHeader.biWidth * cClrBits +31) & ~31) /8 * pbmi->bmiHeader.biHeight; Es wird nicht mit div dividiert, sondern der Compiler rundet (Abs?) erst zum Schluss. |
AW: Korrekte biSizeImage?
Die Basis ist ein HWND (Container) davon das DC zum Zeichnen.
Der Buffer um das Image zu faden ist ein HBitmap egal ob ich direkt ein 32BitHBitmap DC erstelle oder über eine TBitmap gehe und mir davon das DC hole in beiden fällen fehlen mir da unten die paar Pixels. Deshalb die frage was da falsch läuft.. kann sich ja nur um die Berechnung der Bitmap Größe handeln. Hmmm.. nun gut scheint ja so das es Code mäßig deinem Link entspricht. Die Frage bleibt wohl offen woher der Fehler kommt. Danke. gruss |
AW: Korrekte biSizeImage?
Eventuell ein Rundungsfehler?
|
AW: Korrekte biSizeImage?
Zitat:
Ansonsten ist es ein leeres Schwarzes Bitmap. Es ist ja kein Fehler der beim Rendern auf das DC auftritt sondern das leere Bitmap selbst. Es fehlen unten am Rand einfach ein paar Pixel.
Delphi-Quellcode:
Deshalb meine Vermutung das es hier in der Funktion auftritt wo das HBitmap erstellt wird. (bi.bmiHeader.biSizeImage)
function TBassPlayer.CreateDIBSection(DC: HDC; Width, Height, BitCount: Integer): HBitmap;
var bi: BITMAPINFO; begin // BITMAPINFOHEADER befuellen ZeroMemory(@bi, sizeof(BITMAPINFO)); bi.bmiHeader.biSize := sizeof(BITMAPINFOHEADER); bi.bmiHeader.biWidth := FWidth; bi.bmiHeader.biHeight := -FHeight; bi.bmiHeader.biPlanes := 1; bi.bmiHeader.biBitCount := Word(BitCount); bi.bmiHeader.biCompression := BI_RGB; bi.bmiHeader.biSizeImage := DWord(Abs(bi.bmiHeader.biHeight)) * ByteAlignOnWord(Byte(bi.bmiHeader.biBitCount), bi.bmiHeader.biWidth); Result := Windows.CreateDIBSection(DC, bi, DIB_RGB_COLORS, pAddr, 0, 0); end; //.. hDibSec := CreateDIBSection(hTempDc, FWidth, FHeight, 24); Das Problem mit dem schrägen strich durch das Bitmap lag hier dran..
Delphi-Quellcode:
gruss
procedure TBassPlayer.FadeBackBuffer;
type TPixelArray = packed array[0..0] of packed record b, g, r: Byte; end; PPixelArray = ^TPixelArray; var dx: integer; dy: integer; i: integer; begin BitBlt(hTempDc, 0, 0, FWidth, FHeight, DC, 0, 0, SRCCOPY); // Fade die Daten for dy := 0 to FHeight - 1 do begin for dx := 0 to FWidth - 1 do // Hier hatte ich vergessen die weite um 1 zu dekrementieren. (Deshalb der schräge strich bei der Visualisierung) begin i := PPixelArray(pAddr)[dy * FWidth + dx].b - 15; if i < 0 then i := 0; PPixelArray(pAddr)[dy * FWidth + dx].b := i ; i := PPixelArray(pAddr)[dy * FWidth + dx].g - 15; if i < 0 then i := 0; PPixelArray(pAddr)[dy * FWidth + dx].g := i ; i := PPixelArray(pAddr)[dy * FWidth + dx].r - 15; if i < 0 then i := 0; PPixelArray(pAddr)[dy * FWidth + dx].r := i ; end; end; // Blite das gefadete Bild in den Background Buffer. BitBlt(DC, 0, 0, FWidth, FHeight, hTempDc, 0, 0, SRCCOPY); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:27 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz