AGB  ·  Datenschutz  ·  Impressum  







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

Reflektion vom Image

Ein Thema von EWeiss · begonnen am 1. Mai 2017 · letzter Beitrag vom 6. Mai 2017
Antwort Antwort
EWeiss
(Gast)

n/a Beiträge
 
#1

Reflektion vom Image

  Alt 1. Mai 2017, 01:21
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?

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

AlphaCoef := (pBits[3] / 255);
Ist 0 führt dann natürlich zum AV.

gruss

Geändert von EWeiss ( 1. Mai 2017 um 01:32 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.346 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Reflektion vom Image

  Alt 1. Mai 2017, 08:30
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.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

AW: Reflektion vom Image

  Alt 1. Mai 2017, 09:19
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

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

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

gruss
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.060 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Reflektion vom Image

  Alt 2. Mai 2017, 09:07
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;
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

AW: Reflektion vom Image

  Alt 2. Mai 2017, 12:25
Boaheh Wuste doch das ich das schon mal gemacht habe.
oops. Habe es einfach vergessen. Werde alt.

Danke.

gruss
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

AW: Reflektion vom Image

  Alt 6. Mai 2017, 02:45
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

Geändert von EWeiss (11. Jul 2019 um 15:47 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 22:20 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