Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Reflektion vom Image (https://www.delphipraxis.net/192556-reflektion-vom-image.html)

EWeiss 1. Mai 2017 01:21


Reflektion vom Image
 
Ich möchte eine Reflektion von einem Image erstellen.

Delphi-Quellcode:
    if GDIP_CreateFromHDC(ImgHDC, Graphics) = OK then
    begin
      if GDIP_DrawImageRectI(Graphics, Img, 0, 0, imgW, imgH) = OK then
      begin
        GetObject(hbmReturn, sizeof(bm), @bm);
        pBits := bm.bmBits;

        GDIP_ImageRotateFlip(img, 6); //Rotate180FlipX

        GDIP_DrawImageRectI(Graphics, Img, 0, integer(imgH), integer(imgW), integer(imgH));

        w := imgW;
        h := imgH;
        AlphaStep := 256;
        UseStep := 128 / (UseImgH - h);

        // Image Reflektieren
        for y := 0 to (UseImgH - h) - 1 do
        begin
          for x := 0 to (w - 1) do
          begin
            Alpha := MAX(pBits[3] - round(AlphaStep), 0);
            pBits[3] := Alpha;
            pBits := pBits + 4;
          end;
          AlphaStep := AlphaStep - UseStep;
        end;

        for y := 0 to (h - 1) do
        begin
          for x := 0 to (w - 1) do
          begin
            AlphaCoef := (pBits[3] / 255);
            pBits[2] := pBits[2] div round(AlphaCoef);
            pBits[1] := pBits[1] div round(AlphaCoef);
            pBits[0] := pBits[0] div round(AlphaCoef);
            pBits := pBits + 4;
          end;
        end;
        imgH := UseImgH;
        Result := hbmReturn;
      end;
      GDIP_DeleteGraphics(Graphics);
    end;
Es scheint das die verwendete Definition falsch ist.
pBits: Array of PByte will nicht.
pBits: PByte verursacht Zugriffs Verletzung. Weil pBits[2] und die anderen werte immer 0 sind.

was läuft falsch.
Vielleicht nen Pointer vergessen?

Delphi-Quellcode:
pBits := @bm.bmBits;
?
Aber es sind eigentlich beides Pointer.

Delphi-Quellcode:
AlphaCoef := (pBits[3] / 255);

Ist 0 führt dann natürlich zum AV.

gruss

jaenicke 1. Mai 2017 08:30

AW: Reflektion vom Image
 
Zitat:

Zitat von EWeiss (Beitrag 1369558)
Delphi-Quellcode:
pBits := @bm.bmBits;
?
Aber es sind eigentlich beides Pointer.

Wenn du einem Pointer die Adresse eines Pointers zuweist, dann zeigt dieser Pointer natürlich auf diese Adresse. Und ein Pointer ist eben 4 Byte oder 8 Byte lang, je nachdem ob 32bit oder 64bit.

Aber mehr als diese 4 Byte oder 8 Byte sind an dieser Adresse eben nicht zu holen.

Was du meintest ist sicherlich den Pointer selbst an den anderen Pointer zuzuweisen. Ohne das @-Zeichen.

EWeiss 1. Mai 2017 09:19

AW: Reflektion vom Image
 
Zitat:

Was du meintest ist sicherlich den Pointer selbst an den anderen Pointer zuzuweisen.
Was ich ja tue in der 6 Zeile des Quelltextes.
Ich war am überlegen ob da ein Fehler vorliegt.

Nur das hilft mir nicht weiter.
Kann niemand erkennen ob hier ein Fehler vorliegt?
Denn eigentlich müsste

Delphi-Quellcode:
MAX(pBits[3] - round(AlphaStep), 0);


pBits[3] dem wert 128 entsprechen dieser ist aber 0.

gruss

TiGü 2. Mai 2017 09:07

AW: Reflektion vom Image
 
Delphi-Quellcode:
function MussteHaltNochSinnvollBeiDirEinfügen(hbmReturn: HGDIOBJ): HGDIOBJ;
var
  pBits: PRGBQuad; // <----- richtigen Datentyp nehmen!
  // Tipp: http://www.delphipraxis.net/155296-multipletexture-loader.html#post1056155
begin
  if GDIP_CreateFromHDC(ImgHDC, Graphics) = OK then
  begin
    if GDIP_DrawImageRectI(Graphics, Img, 0, 0, imgW, imgH) = OK then
    begin
      // sicherheitshalber Initialisieren, schadet ja nicht
      FillChar(bm, SizeOf(bm), 0);

      // nur weitermachen wenn Funktion GetObject Erfolg meldet
      if GetObject(hbmReturn, SizeOf(bm), @bm) <> 0 then
      begin
        pBits := bm.bmBits;

        GDIP_ImageRotateFlip(Img, 6); // Rotate180FlipX

        GDIP_DrawImageRectI(Graphics, Img, 0, integer(imgH), integer(imgW),
          integer(imgH));

        w := imgW;
        h := imgH;
        AlphaStep := 256;
        UseStep := 128 / (UseImgH - h);

        // Image Reflektieren
        for y := 0 to (UseImgH - h) - 1 do
        begin
          for x := 0 to (w - 1) do
          begin
            Alpha := MAX(pBits.rgbReserved - round(AlphaStep), 0);
            pBits.rgbReserved := Alpha;

            Inc(pBits);
          end;
          AlphaStep := AlphaStep - UseStep;
        end;

        for y := 0 to (h - 1) do
        begin
          for x := 0 to (w - 1) do
          begin
            AlphaCoef := (pBits.rgbReserved / 255);
            pBits.rgbBlue := round(pBits.rgbBlue / AlphaCoef);
            pBits.rgbGreen := round(pBits.rgbGreen / AlphaCoef);
            pBits.rgbRed := round(pBits.rgbRed / AlphaCoef);

            Inc(pBits);
          end;
        end;
        imgH := UseImgH;
        Result := hbmReturn;
      end;
      GDIP_DeleteGraphics(Graphics);
    end;
  end;
end;

EWeiss 2. Mai 2017 12:25

AW: Reflektion vom Image
 
Boaheh ;) Wuste doch das ich das schon mal gemacht habe.
oops. Habe es einfach vergessen. Werde alt.

Danke.

gruss

EWeiss 6. Mai 2017 02:45

AW: Reflektion vom Image
 
So sieht es aus..
Das Problem ist nur ich bekomme mein Window nicht Transparent.
Na ja was soll's werde schon noch eine Lösung erarbeiten.

Der Papierkorb ändert sich abhängig vom Status voll oder leer.

gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:47 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