AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Korrekte biSizeImage?

Ein Thema von EWeiss · begonnen am 20. Jun 2019 · letzter Beitrag vom 21. Jun 2019
Antwort Antwort
EWeiss
(Gast)

n/a Beiträge
 
#1

Korrekte biSizeImage?

  Alt 20. Jun 2019, 08:25
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

Geändert von EWeiss (11. Jul 2019 um 15:58 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#2

AW: Korrekte biSizeImage?

  Alt 21. Jun 2019, 06:43
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

Geändert von EWeiss (21. Jun 2019 um 06:45 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.337 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Korrekte biSizeImage?

  Alt 21. Jun 2019, 07:10
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
Peter
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#4

AW: Korrekte biSizeImage?

  Alt 21. Jun 2019, 07:11
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
Sorry ja Kein Problem.

gruss
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Korrekte biSizeImage?

  Alt 21. Jun 2019, 09:49
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.
Heiko

Geändert von hoika (21. Jun 2019 um 09:51 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

AW: Korrekte biSizeImage?

  Alt 21. Jun 2019, 16:26
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

Geändert von EWeiss (21. Jun 2019 um 16:40 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#7

AW: Korrekte biSizeImage?

  Alt 21. Jun 2019, 17:44
Eventuell ein Rundungsfehler?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
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
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:57 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