AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Einen Ausschnitt einer Metafile in eine Metafile kopieren.

Einen Ausschnitt einer Metafile in eine Metafile kopieren.

Ein Thema von Bjoerk · begonnen am 29. Aug 2014 · letzter Beitrag vom 30. Aug 2014
Antwort Antwort
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#1

Einen Ausschnitt einer Metafile in eine Metafile kopieren.

  Alt 29. Aug 2014, 17:08
Einen Ausschnitt einer Metafile in eine Metafile kopieren.

Ich dachte eigentlich daß man das so eventuell machen könnte, geht aber nicht. Er kopiert so immer die ganze Metafile?

Delphi-Quellcode:
procedure TDrawPad.CopySelectedRectToClipboard(const SelectRect: TFloatRectEx);
var
  ppMM: double;
  Rect: TRect;
  MF: TMetaFile;
  MC: TMetaFileCanvas;
begin
  if SelectRect.Angle = 0 then
  begin
    ppMM := PlotDevice[csDefault].ppMM;
    Rect.Left := Round(ppMM * SelectRect.P1.X);
    Rect.Top := Round(ppMM * SelectRect.P1.Y);
    Rect.Right := Round(ppMM * SelectRect.P2.X);
    Rect.Bottom := Round(ppMM * SelectRect.P2.Y);
    MF := TMetaFile.Create;
    try
      MF.Width := Round(ppMM * SelectRect.Width);
      MF.Height := Round(ppMM * SelectRect.Height);
      MC := TMetaFileCanvas.Create(MF, 0);
      try
        MC.Draw(-Rect.Left, -Rect.Top, FMetaFile);
      finally
        MC.Free;
      end;
      Clipboard.Assign(MF);
      MF.SaveToFile('Test.emf');
    finally
      MF.Free;
    end;
  end;
end;
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.522 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Einen Ausschnitt einer Metafile in eine Metafile kopieren.

  Alt 29. Aug 2014, 17:59
Meintest Du evtl. MC.CopyRect statt MC.Draw?

[edit] Nach kurzer Recherche würde das so auch nicht funktionieren, vielleicht hilft Dir das hier weiter: http://www.borlandtalk.com/metafile-...t-vt38344.html [/edit]
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen

Geändert von DeddyH (29. Aug 2014 um 18:02 Uhr)
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Einen Ausschnitt einer Metafile in eine Metafile kopieren.

  Alt 29. Aug 2014, 20:47
CopyRect und Bitblt sind ja Pixelzeugs.

EnumEnhMetaFile ist nur was für "Männer ohne Nerven" und PlayEnhMetaFile braucht ein hdc.

So stimmt schonmal die Bildgröße, aber Bild ist leer bzw. verschoben:
Delphi-Quellcode:
  IntersectClipRect(MC.Handle, Rect.Left, Rect.Top, Rect.Right, Rect.Bottom);
  MC.Draw(0, 0, FMetaFile);
Dito:
Delphi-Quellcode:
  IntersectClipRect(MC.Handle, Rect.Left, Rect.Top, Rect.Right, Rect.Bottom);
  MC.Draw(-Rect.Left, -Rect.Top, FMetaFile);
???
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.522 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Einen Ausschnitt einer Metafile in eine Metafile kopieren.

  Alt 29. Aug 2014, 21:32
Der hDC für PlayEnhMetaFile müsste doch TMetafileCanvas.Handle sein.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Einen Ausschnitt einer Metafile in eine Metafile kopieren.

  Alt 29. Aug 2014, 22:34
Delphi-Quellcode:
procedure DrawAntiAliased(Source: TMetafile; Dest: HDC; R: TRect);
begin
  Dec(R.Right);
  Dec(R.Bottom);
  PlayEnhMetaFile(Dest, Source.Handle, R);
end;
Weiß nicht, hdc ist zum Beispiel Bildschirm oder Printer.Handle. Kann ich denn als Dest das 2. Metafile.Handle oder MC.Canvas.Handle angben?

Edit: Jo. Geht. Thanx. Ist aber dasselbe wie Draw.

Geändert von Bjoerk (29. Aug 2014 um 23:04 Uhr) Grund: Edit:
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Einen Ausschnitt einer Metafile in eine Metafile kopieren.

  Alt 30. Aug 2014, 13:20
Falls jemand probieren möchte - herzlich willkommen.

-> Anlage.

Krieg's nich hin..
Angehängte Dateien
Dateityp: zip MetafileExampleZip.zip (2,6 KB, 5x aufgerufen)
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Einen Ausschnitt einer Metafile in eine Metafile kopieren.

  Alt 30. Aug 2014, 14:28
Hab's hetzt doch raus. "Er" will die Metafile immer von 0/0 bis Rect.BottomRight;
Delphi-Quellcode:
procedure TMetafileExampleForm.Draw;
var
  MC: TMetafileCanvas;
begin
  FMF2.Width := FRect.Right;
  FMF2.Height := FRect.Bottom;
  PaintBox2.Width := FMF2.Width;
  PaintBox2.Height := FMF2.Height;
  MC := TMetaFileCanvas.Create(FMF2, 0);
  try
    IntersectClipRect(MC.Handle, FRect.Left, FRect.Top, FRect.Right, FRect.Bottom);
    MC.Draw(0, 0, FMF1);
  finally
    MC.Free;
  end;
  Caption := Format('FMF2.Width %d FMF2.Height %d FRect.Width %d FRect.Height %d)',
    [FMF2.Width, FMF2.Height, FRect.Right - FRect.Left, FRect.Bottom - FRect.Top]);
  PaintBox2.Invalidate;
end;
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Einen Ausschnitt einer Metafile in eine Metafile kopieren.

  Alt 30. Aug 2014, 15:22
Letzte Version.

Schönes WE.

Delphi-Quellcode:
procedure TMetafileExampleForm.Draw;
var
  MC: TMetafileCanvas;
  Temp: TMetaFile;
begin
  Temp := TMetaFile.Create;
  try
    Temp.Width := FRect.Right;
    Temp.Height := FRect.Bottom;
    MC := TMetaFileCanvas.Create(Temp, 0);
    try
      IntersectClipRect(MC.Handle, FRect.Left, FRect.Top, FRect.Right, FRect.Bottom);
      MC.Draw(0, 0, FMF1);
    finally
      MC.Free;
    end;
    FMF2.Width := FRect.Right - FRect.Left;
    FMF2.Height := FRect.Bottom - FRect.Top;
    PaintBox2.Width := FMF2.Width;
    PaintBox2.Height := FMF2.Height;
    MC := TMetaFileCanvas.Create(FMF2, 0);
    try
      MC.Draw(-FRect.Left, -FRect.Top, Temp);
    finally
      MC.Free;
    end;
  finally
    Temp.Free;
  end;
  Caption := Format('FMF2.Width %d FMF2.Height %d FRect.Width %d FRect.Height %d)',
    [FMF2.Width, FMF2.Height, FRect.Right - FRect.Left, FRect.Bottom - FRect.Top]);
  PaintBox2.Invalidate;
end;
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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