Entwickler-Ecke

Multimedia / Grafik - bild in ein anderes kopieren


barty - Sa 04.07.09 18:33
Titel: bild in ein anderes kopieren
servus

ich habe folgendes problem

ich möchte ein bild auf bzw in ein anderes kopieren und abspeichern. doch leider hab ich keinen plan wie.

ich lade das erste bild in ein image. das ist soweit kein problem.

nur wie bekomme ich jetzt das 2 bild an eine bestimmt stelle in das image???


kann mir ja jemand weiterhelfen

schon mal danke für evtl. hilfe


jaenicke - Sa 04.07.09 18:37

Wenn du zwei TBitmaps hast, kannst du die Methode Draw verwenden:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
var
  a, b: TBitmap;
begin
...
  a.Canvas.Draw(00, b);
  a.SaveToFile(...);
...
// EDIT:
Crosslink... :roll:
http://www.delphipraxis.net/post1055774.html
// EDIT2: http://forum.delphi-treff.de/showthread.php?p=195360 [http://forum.delphi-treff.de/showthread.php?p=195360]


ffgorcky - Sa 04.07.09 19:18

Also ich denke mal, Du könntest auch sagen, dass Du das andere Bild ab einem bestimmten Pixel einfügen möchtest
- also so, wie es hier [http://www.delphi-forum.de/viewtopic.php?p=303592#303592] gemacht wurde:


Delphi-Quelltext
1:
image1.Canvas.Draw((gewuenschterXAchsenStartpunkt),(gewuenschterYAchsenStartpunkt),einzufuegendesBild);                    


Wobei ich immer nicht so ganz genau weiß, wierum x- und y-Achse sind - ich meine zumindest, dass die X-Achse die waagerechte und die Y-Achse die senkrechte ist - oder?
Oder möchtest Du das ganze lieber Pixel pro Pixel übertragen?

PS: jetzt, wo ich mir das so angucke, fällt mir auf, dass das ja eigentlich auch die Lösung von user profile iconjaenicke ist.


elundril - Sa 04.07.09 19:27

user profile iconffgorcky hat folgendes geschrieben Zum zitierten Posting springen:
Also ich denke mal, Du könntest auch sagen, dass Du das andere Bild ab einem bestimmten Pixel einfügen möchtest
- also so, wie es hier [http://www.delphi-forum.de/viewtopic.php?p=303592#303592] gemacht wurde:

image1.Canvas.Draw((gewuenschterXAchsenStartpunkt),(gewuenschterYAchsenStartpunkt),logobmp);

Wobei ich immer nicht so ganz genau weiß, wierum x- und y-Achse sind - ich meine zumindest, dass die X-Achse die waagerechte und die Y-Achse die senkrechte ist - oder?
Oder möchtest Du das ganze lieber Pixel pro Pixel übertragen?


der link ist eigentlich der selbe code den Jaenicke gepostet hat, nur in etwas längerer form. und pixel für pixel wäre denk ich etwas schlechter von der performance her. ;)

beim Canvas sind afaik x-achse waagerecht und y-achse senkrecht, lediglich der ursprung ist links oben statt links unten.

lg elundril


jaenicke - Sa 04.07.09 19:53

Nicht ganz der selbe Code, bei ihm sind noch Klammern dabei, die, wenn man die in dem Quelltext benutzt, an manchen Stellen zu Kompilierfehlern führen. Man sollte also darauf achten, dass man sich unnötige Klammern erst gar nicht angewöhnt. ;-)


Hidden - Sa 04.07.09 20:43

Hi :)

Wenn die Bilder nicht zufällig die selbe Auflösung haben, könnte das u.U. etwas komisch aussehen. Daher lieber StretchDraw nehmen, dann müsst ihr das Größenverhältnis auch nicht beachten. Das Stretchen verbraucht natürlich auch ein wenig Rechenleistung und macht das Bild gegebenenfalls unschärfer.

Dann bleibt natürlich noch zu erwähnen, dass man Paintboxen oder zur Not auch Images natürlich ausschließlich zur Anzeige verwendet. Also lieber eine Bitmap verwenden, die dann rein im Speicher vorliegt(oder auch gerne ein anderes Dateiformat). ;)


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
procedure CombineImages(const aImgFront, aImgBack, aResPath: String);
var
  aFront, aBack: TBitmap;
  destFrame: TRect;
begin
  aFront := TBitmap.Create;
  aBack := TBitmap.Create;
  aFront.LoadFromFile(aImgFront);
  aBack.LoadFromFile(aImgBack);

  //Zielrechteck zurechtschneiden
  destFrame := aBack.Canvas.ClipRect;  //Gesamter Bildbereich
  destFrame.Left := destFrame.Right div 4;  //links ein Viertel freilassen
  destFrame.Right := destFrame.Right * 3 div 4;  //rechts ein Viertel freilassen
  destFrame.Top := destFrame.Bottom div 4;  //oben ein Viertel freilassen
  destFrame.Bottom := destFrame.Bottom * 3 div 4;  //unten ein Viertel freilassen

  aFront.TransparentColor := clWhite;  //spaßeshalber malen wir mal nur drüber, statt zu ersetzen
  aFront.Transparent := true;
  aBack.Canvas.StretchDraw(destFrame, aFront);

  aBack.SaveToFile(aResPath);
  aBack.Free;
  aFront.Free;
end;


mfG,