Delphi-PRAXiS
Seite 89 von 103   « Erste     3979878889 909199     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   Andorra 2D [Ver. 0.4.5.1, 31.12.08] (https://www.delphipraxis.net/81314-andorra-2d-%5Bver-0-4-5-1-31-12-08%5D.html)

inherited 2. Jan 2009 12:09

Re: Andorra 2D [Ver. 0.4.5.1, 31.12.08]
 
Die Surface-Demo läuft hier wunderbar (Linux, Lazarus, OpenGL)

Florian H 2. Jan 2009 13:17

Re: Andorra 2D [Ver. 0.4.5.1, 31.12.08]
 
Hm.
Wenn ich nach dem Create noch ein
Delphi-Quellcode:
adTextureSF.Texture.Clear;
einfüge, funktioniert es zumindest insofern, dass ich das gezeichnete übertragen kann. Allerdings wird der Inhalt des TextureSurfaces dann nicht gespeichert, sondern ist im nächsten Zeichenschritt wieder verloren (-> Grafikmüll oder gar nichts).
Sprich, ich muss jedesmal neu auf das TextureSurface zeichnen, was aber ja nicht Sinn der Sache ist.

Mich wundert's halt, dass es in OpenGL prima funktioniert... habe auch nochmal die AndorraDX93D.dll neu compiliert, damit wurde sie zwar ~30kb kleiner, hat aber ansonsten nichts gebracht.

xZise 2. Jan 2009 14:16

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

Zitat von igel457
Deinen Sourcecode baue ich bei Gelegenheit ein.[...]

Naja ist ja nicht so die große Sache. Ich kam nur auf die Idee das so umzusetzen, weil ich eine TFixelList habe die von TSpriteList abgeleitet wurde.

Zitat:

Zitat von igel457
[...]AdBitmap.SaveToFile schreibt die Daten (wie im zweiten Tutorial beschrieben) in ein Andorra internes Format. Zu den eigentlichen Bilddaten kommen Informationen über das Texturobjekt (Breite, Höhe, Bittiefe) hinzu.[...]

Ah mist, aber ich wollte jetzt nicht alle Tutorials durchsuchen um möglicherweise was zu finden ;)

Zitat:

Zitat von igel457
[...]Die Dokumentation habe ich jetzt endlich erfolgreich über SSH entpackt.[...]

Okay ich gucke es mir mal an.
Zitat:

Zitat von igel457
[...]Wenn du ein Andorra-Bild in ein anderes Grafikobjekt speichern willst, kannst du die Funktion "SaveToGraphic" verwenden.

Nein ich will nur gucken, ob ein Inhalt eines AdImages wirklich komplett schwarz ist. Und ein SaveToGraphic nützt da nichts, weil davon weiß ich schon was rauskommt.
Und ich habe jetzt das AdImage einfach mal drauf gezeichnet und das Ergebnis ist dass unter Delphi 2009 SaveToGraphic nicht funktioniert.

MfG
xZise

igel457 2. Jan 2009 16:10

Re: Andorra 2D [Ver. 0.4.5.1, 31.12.08]
 
Wenn du wissen möchtest, ob ein TAdImage komplett Schwarz ist, dann speichere es doch in ein TAdBitmap und greife einfach über Scanline darauf zu:
Delphi-Quellcode:
var
  adbmp: TAdBitmap;
  pc: PCardinal;
begin
  adbmp := TAdBitmap.Create;
  AdImage.Texture.SaveToGraphic(adbmp);
  pc := adbmp.Scanline;
  for i := 0 to (adbmp.Size div 4) - 1 do
  begin
    if (pc^ and $FFFFFF00) <> 0 then Nicht Schwarz //and $FFFFFF00 ist um den Alphakanal zu ignorieren
    inc(pc);
  end;
  adbmp.Free;
end;

xZise 2. Jan 2009 17:19

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

Zitat von igel457
Wenn du wissen möchtest, ob ein TAdImage komplett Schwarz ist, dann speichere es doch in ein TAdBitmap und greife einfach über Scanline darauf zu:
Delphi-Quellcode:
var
  adbmp: TAdBitmap;
  pc: PCardinal;
begin
  adbmp := TAdBitmap.Create;
  AdImage.Texture.SaveToGraphic(adbmp);
  pc := adbmp.Scanline;
  for i := 0 to (adbmp.Size div 4) - 1 do
  begin
    if (pc^ and $FFFFFF00) <> 0 then Nicht Schwarz //and $FFFFFF00 ist um den Alphakanal zu ignorieren
    inc(pc);
  end;
  adbmp.Free;
end;

Hmmm also damit funktioniert es, aber mit diesem Code nicht:
Delphi-Quellcode:
bmp := TBitmap.Create;
try
  AImgBuf.Texture.SaveToGraphic(bmp);
  bmp.SaveToFile(ExtractFilePath(ParamStr(0)) + 'Neuer Ordner\' + AName + '-a.bmp');
finally
  bmp.Free;
end;
MfG
xZise

igel457 2. Jan 2009 17:38

Re: Andorra 2D [Ver. 0.4.5.1, 31.12.08]
 
Debugge das "SaveToFile" doch mal durch. Dann erkennst du doch vermutlich wo es scheitert.

xZise 2. Jan 2009 18:30

Re: Andorra 2D [Ver. 0.4.5.1, 31.12.08]
 
Ehm warum das denn? Also erstens nehme ich an dass der VCL Code soweit i.O. ist und zweitens könnte ich dieses Bitmap auch mit einem TImage verknüpfen und würde nur eine Schwarze Fläche sehen.

MfG
xZise

[edit=0]Ich meine natürlich nicht den VLC media player sondern die Visual Component Library[/edit]

igel457 2. Jan 2009 20:05

Re: Andorra 2D [Ver. 0.4.5.1, 31.12.08]
 
Ich meinte natürlich SaveToGraphic :oops:

xZise 2. Jan 2009 20:09

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

Naja ich habe es vermutlich auf das Kopieren der Daten (AssignTo der Klasse TAdVCLFormat^^) eingegrenzt. Aber so richtig weiß ich nicht, was ich da testen könnte.

Was sein könnte, dass er irgendwie die Hintergrundfarbe nicht richtig setzt, weil da wo Transparenz ist, sieht man schwarz (durchscheinen).

Trace von SaveToGrapic
  1. AImgBuf.SaveToGraphic -> procedure TAdTexture.SaveToGraphic(AGraphic: TObject);
  2. AImgBuf.Texture.SaveToBitmap -> ?????
  3. bmp (TAdBitmap).AssignTo -> procedure TAdBitmap.AssignTo(AGraphic: TObject);
  4. tmp (TAdGraphicFormat).AssignTo -> function TAdVCLFormat.AssignTo(ABitmap: TAdBitmap; AGraphic: TObject): boolean;

Delphi-Quellcode:
function TAdVCLFormat.AssignTo(ABitmap: TAdBitmap;
  AGraphic: TObject): boolean;
var
  bmp: TBitmap;
  y: integer;
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
      Move(ABitmap.ScanLine(y)^, bmp.ScanLine[y]^, ABitmap.Width * 4);

    TGraphic(AGraphic).Assign(bmp);
  finally
    bmp.Free;
  end;
end;
Wenn ich da das bmp speichere habe ich schon den Big. Das heißt ich vermute es liegt irgendwie an den Move. Wobei ich natürlich da vorher das ABitmap getestet habe und wenn ich vor der for-Schleife das Bitmap teste läuft alles wunderbar:

Delphi-Quellcode:
function TAdVCLFormat.AssignTo(ABitmap: TAdBitmap;
  AGraphic: TObject): boolean;
var
  bmp: TBitmap;
  y: integer;

  i : Integer;
  pc: PCardinal;
begin
  result := true;
 
  bmp := TBitmap.Create;
  try
    bmp.PixelFormat := pf32Bit;
    bmp.Width := ABitmap.Width;
    bmp.Height := ABitmap.Height;

    pc := ABitmap.Scanline;
    for i := 0 to (ABitmap.Size div 4) - 1 do
    begin
      if (pc^ and $FFFFFF00) <> 0 then Beep;
      inc(pc);
    end;

    for y := 0 to bmp.Height - 1 do
      Move(ABitmap.ScanLine(y)^, bmp.ScanLine[y]^, ABitmap.Width * 4);
    bmp.SaveToFile(ExtractFilePath(ParamStr(0)) + 'Neuer Ordner\' + IntToStr(Random(MaxInt - 1)) + '-a.bmp');
    TGraphic(AGraphic).Assign(bmp);
  finally
    bmp.Free;
  end;
end;
MfG
xZise

igel457 2. Jan 2009 20:40

Re: Andorra 2D [Ver. 0.4.5.1, 31.12.08]
 
Ersetzte die MoveTo Zeilen mal Schritt für Schritt durch die folgenden Codeschnipsel und schildere was passiert:

1.
Delphi-Quellcode:
var
  pc1, pc2: PCardinal;
  x, y: integer;
begin
  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^ := $FF0000FF; //Blaues Bitmap, Alpha $FF
      inc(pc1);
      inc(pc2);
    end;
  end;  
end;
2.
Delphi-Quellcode:
var
  pc1, pc2: PCardinal;
  x, y: integer;
begin
  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^ := $FFFFFFFF; //Weißes Bitmap, Alpha $FF
      inc(pc1);
      inc(pc2);
    end;
  end;  
end;
3.
Delphi-Quellcode:
var
  pc1, pc2: PCardinal;
  x, y: integer;
begin
  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^ or $000000FF; //Inhalt ABitmap, Alpha $FF
      inc(pc1);
      inc(pc2);
    end;
  end;  
end;

4.
Delphi-Quellcode:
var
  pc1, pc2: PCardinal;
  x, y: integer;
begin
  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;  
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:04 Uhr.
Seite 89 von 103   « Erste     3979878889 909199     Letzte »    

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