Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Schwarzes Bild nach Größenänderung mit GR32 (https://www.delphipraxis.net/74763-schwarzes-bild-nach-groessenaenderung-mit-gr32.html)

ManuMF 8. Aug 2006 13:07


Schwarzes Bild nach Größenänderung mit GR32
 
Hallo, ich habe ein Problem mit folgender Funktion, die mir ein Bild laden soll und es verkleinert an ein TImage übergeben soll:
Delphi-Quellcode:
procedure TVSForm.BildLaden(BDName: String; BMP: TBitmap);

var JPG: TJpegImage;
    TmpBMP: TBitmap32;

begin
  TmpBMP := TBitmap32.Create;
  try
    if ((AnsiLowerCase(ExtractFileExt(BDName)) = '.jpg') or (AnsiLowerCase(ExtractFileExt(BDName)) = '.jpeg')) then
    begin
      JPG := TJpegImage.Create;
      try
        JPG.LoadFromFile(BDName);
        TmpBMP.Assign(JPG);
      finally
        FreeAndNil(JPG);
      end;
    end
    else if (AnsiLowerCase(ExtractFileExt(BDName)) = '.bmp') then
      TmpBMP.LoadFromFile(BDName);

    TmpBMP.SetSize(188, 142);
    BMP.Assign(TmpBMP);
  finally
    FreeAndNil(TmpBMP);
  end;
end;

//Aufruf
BildLaden('Name', VSBild.Picture.Bitmap);
allerdings wird nur ein komplet schwarzes Bild übergeben, sonst keine Fehler.

:arrow: auch wenn ich direkt Bitmap32.LoadFromFile -> SetSize -> SaveToFile ausführe, ist das Ergebnis schwarz, es sollte also nicht an der Art der Übergabe meiner Prozedure liegen.

Aber woran könnte es dann liegen?

ManuMF 9. Aug 2006 09:31

Re: Schwarzes Bild nach Größenänderung mit GR32
 
Niemand eine Idee? :(

Ich weiß, es fehlen noch 3:26, aber nachher kann ich nicht an den PC ;-)

winx 15. Aug 2006 14:18

Re: Schwarzes Bild nach Größenänderung mit GR32
 
Hi,

du solltest wohl einen StrechtFilter verwenden, oder ab der
version 1.81 einen Resampler...

weisst du wie das geht???
Bin da auch am rumprobieren...hab das Problem das ich nach dem Drehen eines
Bildes immer einen schwarzen Hintergrung bekomme. In der früheren Version
war der Hintergrund immer weiss...

vielleicht können wir uns gegenseitig helfen :gruebel:

gruß,
winx

winx 15. Aug 2006 14:53

Re: Schwarzes Bild nach Größenänderung mit GR32
 
Hi,

versuch mal folgendes:

Delphi-Quellcode:
procedure TForm1.BildLaden(BDName: String; BMP: TBitmap32);
var JPG: TJpegImage;
    TmpBMP: TBitmap32;
begin
  TmpBMP := TBitmap32.Create;
  try
    if ((AnsiLowerCase(ExtractFileExt(BDName)) = '.jpg') or (AnsiLowerCase(ExtractFileExt(BDName)) = '.jpeg')) then
    begin
      JPG := TJpegImage.Create;
      try
        JPG.LoadFromFile(BDName);
        TmpBMP.Assign(JPG);
      finally
        FreeAndNil(JPG);
      end;
    end
    else if (AnsiLowerCase(ExtractFileExt(BDName)) = '.bmp') then
      TmpBMP.LoadFromFile(BDName);

    //TmpBMP.SetSize(188, 142);
    BMP.Assign(TmpBMP);

  finally
    FreeAndNil(TmpBMP);
  end;
end;

{$R *.dfm}

procedure TForm1.FormShow(Sender: TObject);
begin
  //Aufruf
  BildLaden('C:\\alba.jpg', Image321.Bitmap);
  Paint;
 
end;
hast du ne lösung für den schwarzen hintergrund??? wie krieg ich den weiss???

DGL-luke 15. Aug 2006 15:19

Re: Schwarzes Bild nach Größenänderung mit GR32
 
ok... setsize setzt das bild komplett zurück, es bekommt dabei auch ein neues handle. die hilfedatei ist da leider nicht besonders klar, bzw. da steht überhaupt nix drin, das sagt, wie sich der bildinhalt verhält.

@winx: Dein Codeschnipsel lässt das resizen einfach komplett weg :stupid:

Also, ich werd mich jetzt sofort dransetzen und n demoprogramm schreiben (wenn ichs selber hinbekomm). Mehr als zwei Stunden soll ich nciht brauchen.

DGL-luke 15. Aug 2006 15:48

Re: Schwarzes Bild nach Größenänderung mit GR32
 
Liste der Anhänge anzeigen (Anzahl: 1)
sodele... siehe anhang.

lädt bmps (nativ) und jpegs (TPicture-Erweiterung jpeg-Unit).

Original kommt ins linke Image, Nach Klick auf "Skalieren" kommt skaliertes bild ins rechte image.

:oops: die implementation des labels links oben hab ich leider vergessen.

EDIT: unter Examples/Resampling gibts entsprechende Demos. (GR32 1.8.1)

winx 16. Aug 2006 10:19

Re: Schwarzes Bild nach Größenänderung mit GR32
 
Hi,

erstmal danke :-) Ich hab das bei mir auch bemerkt...

Ne andere Frage. Weisst du auch ne Lösung für das problem, das mein hintergrund immer schwarz ist???
Mir ist es möglich alle Bilder usw zu drehen und zu strecken.
allerdings ist der Hintergrund immer schwarz...in meiner alten Version
(ich habe des Projekt von D7 importiert) war er weiß...

ManuMF 16. Aug 2006 10:41

Re: Schwarzes Bild nach Größenänderung mit GR32
 
Cool, danke, jetzt klappt es endlich :thumb:

Hier noch mal meine Funktion, die das Ändern übernimmt:

Delphi-Quellcode:
procedure GroesseAnpassen(BDatei: String);

var GF_O, GF_Z, GF_K: TBitmap32;
    KRS: TKernelResampler;
    Rect_Z: TRect;
    Rect_O: TRect;

begin
  GF_O := TBitmap32.Create;
  GF_Z := TBitmap32.Create;
  GF_K := TBitmap32.Create;

  try
    KRS := TKernelResampler.Create(GF_Z);
    KRS.Kernel := TLanczosKernel.Create;

    GF_O.LoadFromFile(BDatei);
    GF_Z.SetSize(Screen.DesktopWidth, Screen.DesktopHeight);

    Rect_Z := Screen.DesktopRect;

    Rect_O.TopLeft := Point(0, 0);
    Rect_O.BottomRight := Point(GF_O.Width, GF_O.Height);

    KRS.Resample(GF_Z, Rect_Z, Rect_Z, GF_O, Rect_O, DmOpaque, nil);

    GF_Z.SaveToFile(BDatei);
  finally
    FreeAndNil(GF_O);
    FreeAndNil(GF_Z);
    FreeAndNil(GF_K);
  end;
end;
So klappt es auf jeden Fall.
Wenn etwas nicht in Ordnung (Überflüssiges, Vergessenes) ist, bitte schreiben! :)

winx 16. Aug 2006 11:45

Re: Schwarzes Bild nach Größenänderung mit GR32
 
Hi,

also ich bekomme hier den Fehler:

Delphi-Quellcode:
    PT:=TProjectiveTransformation.create;
    PT.Srcrect:=Floatrect(0,0,bmpact.width-1,bmpact.height-1);
    //SetBorderTransparent(bmpact,Rect(0, 0, bmpact.Width - 1, bmpact.Height - 1));

    PT.X0:=CalcMousePosfromX(TransformPoint(TM,CADPoint(0,1)).X);
    PT.Y0:=CalcMousePosfromY(TransformPoint(TM,CADPoint(0,1)).Y);
    PT.X1:=CalcMousePosfromX(TransformPoint(TM,CADPoint(1,1)).X);
    PT.Y1:=CalcMousePosfromY(TransformPoint(TM,CADPoint(1,1)).Y);
    PT.X2:=CalcMousePosfromX(TransformPoint(TM,CADPoint(1,0)).X);
    PT.Y2:=CalcMousePosfromY(TransformPoint(TM,CADPoint(1,0)).Y);
    PT.X3:=CalcMousePosfromX(TransformPoint(TM,CADPoint(0,0)).X);
    PT.Y3:=CalcMousePosfromY(TransformPoint(TM,CADPoint(0,0)).Y);

    GR32_Transforms.Transform(ABitmap,bmpact,PT);

    PT.free;
das Bild bmpact ist danach schräg, und der Hintergrund ist (da es ja immer rechteckig dargestellt wird)
schwarz statt weiss!!!

So ein Dreck...weiss jemand was da bei der Transformation schief geht?

DGL-luke 16. Aug 2006 11:50

Re: Schwarzes Bild nach Größenänderung mit GR32
 
der hintergrund ist eben schwarz statt weiß - sollte ja wohl irgendwo eine einstellung dazu geben.

Eventuell wird da auch direkt das Alpha auf 0 gestellt - immerhin ist da ja rein gar nichts. also einfach alle durchgehen, wenn alpha 0, alpha auf 255/1 stellen und weiss machen.

EDIT: Du solltest das über TColor32Entry(Bitmap.Pixel[x,y]).A herausfinden können.

winx 16. Aug 2006 12:43

Re: Schwarzes Bild nach Größenänderung mit GR32
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hi,

versteh ich nich ganz, aber das Problem ist, das ja das
bmpact in das PT.srcrect hineinprojeziert wird.

das bmpact wird dan verzerrt und korrekt wiedergegeben.nur
ist eben der hintergrund von dem srcrect schwarz....(siehe anhang)

Und davor war es nicht schwarz sondern transparent. Kann es sein,
dass früher noch kein Alpha Wert vorhanden war, der jetzt existiert???

wie soll ich das dann ändern??

danke...

DGL-luke 16. Aug 2006 14:28

Re: Schwarzes Bild nach Größenänderung mit GR32
 
also am unterschied D2006<>D7 kanns nicht liegen, eher am unterschied >=GR32-1.8/<Gr32-1.8.

Und ansonsten gilt das, was ich oben gesagt habe. Ob die Transformation da echtes schwarz hinterlässt oder eben nur Alpha=0 und der TImage32-Container das eben als schwarz anzeigt, weiß ich nicht. Ich werds gleich mal ausprobieren.

winx 16. Aug 2006 14:47

Re: Schwarzes Bild nach Größenänderung mit GR32
 
hab gerade was geschafft:

mit

Delphi-Quellcode:
    PT:=TProjectiveTransformation.create;

    //SetBorderTransparent(bmpact,Rect(0, 0, bmpact.Width - 1, bmpact.Height - 1));

    PT.X0:=CalcMousePosfromX(TransformPoint(TM,CADPoint(0,1)).X);
    PT.Y0:=CalcMousePosfromY(TransformPoint(TM,CADPoint(0,1)).Y);
    PT.X1:=CalcMousePosfromX(TransformPoint(TM,CADPoint(1,1)).X);
    PT.Y1:=CalcMousePosfromY(TransformPoint(TM,CADPoint(1,1)).Y);
    PT.X2:=CalcMousePosfromX(TransformPoint(TM,CADPoint(1,0)).X);
    PT.Y2:=CalcMousePosfromY(TransformPoint(TM,CADPoint(1,0)).Y);
    PT.X3:=CalcMousePosfromX(TransformPoint(TM,CADPoint(0,0)).X);
    PT.Y3:=CalcMousePosfromY(TransformPoint(TM,CADPoint(0,0)).Y);

    PT.Srcrect:=Floatrect(0,0,(bmpact.width-1),(bmpact.height-1));

    //transparentColor : TColor32;

    TColor32Entry(transparentColor).A := 255;
    TColor32Entry(transparentColor).R := 255;
    TColor32Entry(transparentColor).G := 255;
    TColor32Entry(transparentColor).B := 255;

    bmpact.OuterColor := transparentColor;
    GR32_Transforms.Transform(ABitmap,bmpact,PT);

    PT.free;

  end;
wird der hintergrund weiss, aber noch nicht durchsichtig....aber ich probiers weiter

DGL-luke 16. Aug 2006 15:02

Re: Schwarzes Bild nach Größenänderung mit GR32
 
Zitat:

Zitat von winx
aber noch nicht durchsichtig....

Delphi-Quellcode:
   
    TColor32Entry(transparentColor).A := 0;

so besser?

PS: auf outercolor bin ich auch nicht gekommen....

winx 16. Aug 2006 15:07

Re: Schwarzes Bild nach Größenänderung mit GR32
 
auch 0 bringt gar nix, kann es irgendwie sein,
dass der rechner das alpha einfach ignoriert bei der farbdarstellung?

DGL-luke 16. Aug 2006 17:30

Re: Schwarzes Bild nach Größenänderung mit GR32
 
ich hab das vorher selber probiert, das TImage32 ignoriert das offenbar. Kannst es ja mal mit TImgView32 versuchen, ka obs mit dem geht.

winx 17. Aug 2006 07:16

Re: Schwarzes Bild nach Größenänderung mit GR32
 
klappt auch leider nicht :-(
im moment hab ich keine plan ob das überhaupt geht.
schade, dass sie das in der neuen version herausgenommen haben...

hast du noch ne idee, wie ich die outercolor (jetzt weiss ich wenigstens wie die eigenschaft heisst:-)
transparent bekommen könnte?

gruß und danke für deine hilfe,
winx

DGL-luke 17. Aug 2006 11:25

Re: Schwarzes Bild nach Größenänderung mit GR32
 
Nur nochmal zum Mitschreiben: Du willst es transparent anzeigen lassen.

Dann kannst du auch das Bild durchgehen, alle Pixel, die Alpha=0 haben, auf eine beliebige Transparenzfarbe schalten (z.B. clFuchsia), das Bild in einen Stream speichern, ein TBitmap erzeugen, dieses aus dem Stream laden, ins ein TImage laden, und in dem Transparent:=true und TransparentColor := clFuchsia stellen.

Es ist zwar idiotisch, dass TImage32 das nicht kann, aber so müsste es funktionieren.

EDIT: Eventuell reicht es schon, OuterColor auf die Transparenzfarbe zu stellen und dann zu speichern, vielleicht wird das dann automatisch ersetzt.

EDIT: :wall:

Es reicht, beim Bitmap den Drawmode auf dmBlend zu stellen :wall:

winx 17. Aug 2006 11:50

Re: Schwarzes Bild nach Größenänderung mit GR32
 
jawohl so gehts, der drawmode hat mir gefehlt :-)

Delphi-Quellcode:
    PT:=TProjectiveTransformation.create;


    PT.Srcrect:=Floatrect(0,0,(bmpact.width-1),(bmpact.height-1));

    PT.X0:=CalcMousePosfromX(TransformPoint(TM,CADPoint(0,1)).X);
    PT.Y0:=CalcMousePosfromY(TransformPoint(TM,CADPoint(0,1)).Y);
    PT.X1:=CalcMousePosfromX(TransformPoint(TM,CADPoint(1,1)).X);
    PT.Y1:=CalcMousePosfromY(TransformPoint(TM,CADPoint(1,1)).Y);
    PT.X2:=CalcMousePosfromX(TransformPoint(TM,CADPoint(1,0)).X);
    PT.Y2:=CalcMousePosfromY(TransformPoint(TM,CADPoint(1,0)).Y);
    PT.X3:=CalcMousePosfromX(TransformPoint(TM,CADPoint(0,0)).X);
    PT.Y3:=CalcMousePosfromY(TransformPoint(TM,CADPoint(0,0)).Y);

    TColor32Entry(transparentColor).A := 0;
    TColor32Entry(transparentColor).R := 255;
    TColor32Entry(transparentColor).G := 255;
    TColor32Entry(transparentColor).B := 255;

    bmpact.OuterColor := transparentColor;
    bmpact.DrawMode := dmBlend;
    SetBorderTransparent(bmpact,Rect(0, 0, bmpact.Width - 1, bmpact.Height - 1));
    GR32_Transforms.Transform(ABitmap,bmpact,PT);

    PT.free;
Danke euch beiden für Eure Hilfe !!!


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