Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Korrekte biSizeImage? (https://www.delphipraxis.net/201069-korrekte-bisizeimage.html)

EWeiss 20. Jun 2019 08:25


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:
  bi.bmiHeader.biSizeImage := DWord(Abs(bi.bmiHeader.biHeight)) *
    ByteAlignOnWord(Byte(bi.bmiHeader.biBitCount), bi.bmiHeader.biWidth);
EDIT:
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

EWeiss 21. Jun 2019 06:43

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

Jasocul 21. Jun 2019 07:10

AW: Korrekte biSizeImage?
 
Zitat:

Zitat von EWeiss (Beitrag 1435121)
Schade das da niemand bescheid weis. :|

Denke daran, dass gestern ein Feiertag in einigen Bundesländern war. Dementsprechend ist heute bei vielen ein Brückentag.
Erfahrungsgemäß ist das Forum dann nicht so gut besucht. Und jetzt kommt dann auch noch das Wochenende.

Warte einfach noch ein wenig ab :wink:

EWeiss 21. Jun 2019 07:11

AW: Korrekte biSizeImage?
 
Zitat:

Zitat von Jasocul (Beitrag 1435124)
Zitat:

Zitat von EWeiss (Beitrag 1435121)
Schade das da niemand bescheid weis. :|

Denke daran, dass gestern ein Feiertag in einigen Bundesländern war. Dementsprechend ist heute bei vielen ein Brückentag.
Erfahrungsgemäß ist das Forum dann nicht so gut besucht. Und jetzt kommt dann auch noch das Wochenende.

Warte einfach noch ein wenig ab :wink:

Sorry ja ;) Kein Problem.

gruss

hoika 21. Jun 2019 09:49

AW: Korrekte biSizeImage?
 
Hallo,
darauf bezieht sich ja dein Code
https://docs.microsoft.com/en-us/win...oring-an-image

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.

EWeiss 21. Jun 2019 16:26

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

Luckie 21. Jun 2019 17:44

AW: Korrekte biSizeImage?
 
Eventuell ein Rundungsfehler?

EWeiss 21. Jun 2019 18:09

AW: Korrekte biSizeImage?
 
Zitat:

Zitat von Luckie (Beitrag 1435154)
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


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:50 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz