Einzelnen Beitrag anzeigen

EWeiss
(Gast)

n/a Beiträge
 
#8

AW: Korrekte biSizeImage?

  Alt 21. Jun 2019, 18:09
Eventuell ein Rundungsfehler?
Die frage ist welcher denn ich mache mit dem Bitmap nichts außer das es als Container verwendet wird.
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:
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);
Deshalb meine Vermutung das es hier in der Funktion auftritt wo das HBitmap erstellt wird. (bi.bmiHeader.biSizeImage)

Das Problem mit dem schrägen strich durch das Bitmap lag hier dran..
Delphi-Quellcode:
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;
gruss

Geändert von EWeiss (21. Jun 2019 um 18:14 Uhr)
  Mit Zitat antworten Zitat