AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte Andorra 2D [Ver. 0.4.5.1, 31.12.08]
Thema durchsuchen
Ansicht
Themen-Optionen

Andorra 2D [Ver. 0.4.5.1, 31.12.08]

Ein Thema von igel457 · begonnen am 24. Nov 2006 · letzter Beitrag vom 14. Sep 2011
 
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#11

Re: Andorra 2D [Ver. 0.4.5.1, 31.12.08]

  Alt 2. Jan 2009, 21:54
Hmmm also ich habe jetzt die "alte" Methode entfernt und sie neu deklariert:
Delphi-Quellcode:
function TAdVCLFormat.AssignTo(ABitmap: TAdBitmap;
  AGraphic: TObject): boolean;
var
  pc1, pc2: PCardinal;
  x, y: integer;
  bmp: TBitmap;
begin
  bmp := TBitmap.Create;
  try
    bmp.PixelFormat := pf32Bit;
    bmp.Width := ABitmap.Width;
    bmp.Height := ABitmap.Height;
// Ab hier habe ich das aus deinen Codesniplseln kopiert
    for y := 0 to bmp.Height - 1 do
    begin
      pc1 := bmp.Scanline[y];
      pc2 := ABitmap.Scanline(y);
      for x := 0 to bmp.Width - 1 do
      begin
        pc1^ := pc2^; //Inhalt ABitmap, Alpha $FF
        inc(pc1);
        inc(pc2);
      end;
    end;
// Bis hier
  finally
    bmp.free;
  end;
end;
Ergebnis war jedes mal eine weiße Fläche. Ich müsste auch bmp der Grafik zuweisen. Jetzt bekomme ich vernünftige Ergebnisse:
  1. Blaues Bitmap durchgehend (ohne Transparenzen)
  2. Weißes Bitmap (ohne Transprenzen wahrscheinlich (Hg war weiß))
  3. Inhalt der Grafik, Bläulich, "Hintergrund" ist schwarz
  4. Inhalt der Grafik, "Hintergrund" ist schwarz

Hier ist mein Workaround für weiße Hintergrundflächen:
Delphi-Quellcode:
function TAdVCLFormat.AssignTo(ABitmap: TAdBitmap;
  AGraphic: TObject): boolean;
var
  bmp: TBitmap;
  y, x: integer; var i : Integer;

  LineIn, LineOut : PCardinal;
  LineInRec : LongRec;
begin
  result := true;

  bmp := TBitmap.Create;
  try
    bmp.PixelFormat := pf32Bit;
    bmp.Width := ABitmap.Width;
    bmp.Height := ABitmap.Height;

    for y := 0 to bmp.Height - 1 do
    begin
      LineIn := ABitmap.ScanLine(y);
      LineOut := bmp.ScanLine[y];
      for x := 0 to bmp.Width - 1 do
      begin
        LineInRec.Bytes[0] := 255 - LineIn^ shr 24;
        LineInRec.Bytes[1] := (LineIn^ shr 16) and $00FF;
        LineInRec.Bytes[2] := (LineIn^ shr 8) and $0000FF;
        LineInRec.Bytes[3] := LineIn^ and $000000FF;

        for i := 1 to 3 do
        begin
          if LineInRec.Bytes[0] < 255 - LineInRec.Bytes[i] then
            LineInRec.Bytes[i] := LineInRec.Bytes[0] + LineInRec.Bytes[i]
          else
            LineInRec.Bytes[i] := $FF;
        end;

        LineOut^ := $FF000000 or (LineInRec.Bytes[1] shl 16) or (LineInRec.Bytes[2] shl 8) or (LineInRec.Bytes[3]);

        Inc(LineIn);
        Inc(LineOut);
      end;
    end;

    TGraphic(AGraphic).Assign(bmp);
  finally
    bmp.Free;
  end;
end;
Wie man sieht längst nicht so performat wie dein Code, aber damit bekomme ich immerhin Transparenz.

Übrigens gibt es eine Möglichkeit bei deinem Canvas auch Kreis/Rechtecksringe zu zeichnen? Und wie sieht es mit abgerundeten Rechtecken aus?

Btw, wenn du möchtest könntest du noch folgende Funktionen implementieren (Dürfte es alle nicht geben):
Delphi-Quellcode:
function AdPoint(const APoint : TPoint) : TAdPoint; overload;
begin
  Result := AdPoint(APoint.X, APoint.Y);
end;

function AdRect(ACorner1, ACorner2 : TAdPoint; const APreventFlipOver : Boolean = true) : TAdRect; overload;
var
  CornerBuffer : TAdPoint;
begin
  if APreventFlipOver then
  begin
    if (ACorner1.X > ACorner2.X) or (ACorner1.Y > ACorner2.Y) then
    begin
      CornerBuffer := ACorner1;
      ACorner1 := ACorner2;
      ACorner2 := CornerBuffer;
    end;
  end;
  Result := AdRect(ACorner1.X, ACorner1.Y, ACorner2.X, ACorner2.Y);
end;

function AdRect(ACorner1, ACorner2 : TPoint; const APreventFlipOver : Boolean = true) : TAdRect; overload;
begin
  Result := AdRect(AdPoint(ACorner1), AdPoint(ACorner2), APreventFlipOver)
end;
MfG
xZise
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
 


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 11:38 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz