| Autor |
Beitrag |
Christoph1972
      
Beiträge: 690
Erhaltene Danke: 16
VS2015 Pro / C# & VB.Net
|
Verfasst: So 10.02.13 10:50
Hallo zusammen,
ich möchte eine EMF Grafik zoomen. Ich bekomme das mit den üblichen Methoden, die Google ausspukt, zwar hin, jedoch nicht ohne Qualitätsverluste.
Hat jemand eine Idee wie ich Grafik verlustfrei zoomen kann? Es ist ja eine Vectorgrafik, demnach sollte es doch eine Möglichkeit geben. Die Windows Bild- und Faxanzeige kann das ja schließlich auch.
_________________ Gruß
Christoph
|
|
Th69
      

Beiträge: 4807
Erhaltene Danke: 1061
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: So 10.02.13 12:57
Hallo Christoph,
welche Methode hast du denn zum Zoomen benutzt?
Ich habe noch folgende Komponente gefunden: www.codeproject.com/...e-Viewer-UserControl
|
|
Christoph1972 
      
Beiträge: 690
Erhaltene Danke: 16
VS2015 Pro / C# & VB.Net
|
Verfasst: So 10.02.13 14:13
Hallo TH69 !
Ich verwende diese Methode:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| private Bitmap ScaleDown(Bitmap vectorImage) { Size newSize = pictureBoxEMF.Size;
Bitmap newBitmap = new Bitmap(newSize.Width, newSize.Height);
using (Graphics g = Graphics.FromImage(newBitmap)) { g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; g.DrawImage(vectorImage, new Rectangle(0, 0, newSize.Width, newSize.Height)); }
vectorImage.Dispose();
return newBitmap; } |
Mit diesem EMF Format ist das eh so eine Sache. Ich habe bis heute keine Möglichkeit gefunden wie man Text einfügen kann. Zudem wird das Format ab FW 4.0 bzw. mit WPF nicht mehr unterstützt, da es wohl gerne Viren überträgt.
Vielen Dank schon mal für den Link! Ich muss mal sehen ob da etwas brauchbares drinn steckt!?
[EDIT]
bei dieser Methode liegt auch eine Bitmap zugrunde und keine EMF-Datei mehr, oder?
_________________ Gruß
Christoph
|
|
Th69
      

Beiträge: 4807
Erhaltene Danke: 1061
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: So 10.02.13 19:28
Hallo,
das Problem scheint wirklich das Bitmap zu sein, d.h. daß dieses dann gezoomt wird (anstatt auf Basis des EMF-Formats).
Nun noch ein anderer Link, der vllt. vielversprechender ist: MFRasterizer Library (es gibt auch eine C#-Version davon weiter unten zum download).
Auch wenn es nur eine Demo-Version ist, aber schau mal ob dein EMF-Bild überhaupt besser aussieht.
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: So 10.02.13 19:41
Hallo!
So bekomme ich eine EMF-Grafik so groß gezeichnet, wie ich will:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7:
| var mf = new Metafile(@"d:\test.emf");
var bmp = new Bitmap(2048, 2048); using (var gr = Graphics.FromImage(bmp)) gr.DrawImage(mf, new Rectangle(0, 0, 2023, 2023));
pictureBox1.Image = bmp; |
Die Metafile-Klasse ist Teil des Frameworks.
Grüße,
Christian
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Th69
      

Beiträge: 4807
Erhaltene Danke: 1061
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: So 10.02.13 22:44
Danke Christian! Die Klasse kannte ich noch nicht.
Dann muß Christoph mal testen, wie damit die Qualität ist.
|
|
Christoph1972 
      
Beiträge: 690
Erhaltene Danke: 16
VS2015 Pro / C# & VB.Net
|
Verfasst: So 10.02.13 22:46
Hallo Zusammen!
@Christian: Danke für den Tipp! Mit der Metafile Klasse hatte ich bisher nicht experimentiert. Ich möchte mein Image auch nicht einfach beliebig vergrößern, sondern mit einer "Clip-Funktion" ein Teil von dem Image ausschneiden und diesen dann auf die Größe des ursprünglichen Bildes vergrößern. Die Grundfunktion läuft soweit, leider mit einem Verlust der Qualität. Mein Problem ist wohl, das die "Clip-Funktion" auf das Image der PictureBox angewendet wird und eben nicht auf das Metafile.
Könnte es gelingen, wenn ich die Methoden für die PictureBox immer parallel auf die Vektorgrafik anwende? Oder denke ich gerade zu kompliziert??
Ich glaube das muss ich erstmal eine Nacht drüber schlafen.......
Vielleicht hat in der Zwischenzeit noch jemand eine Anregung für mich
_________________ Gruß
Christoph
|
|
Th69
      

Beiträge: 4807
Erhaltene Danke: 1061
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: So 10.02.13 22:52
Dann nimm einfach das in Christians Code erstellt Bitmap und wende darauf dann die "Clip-Funktion" an.
Bzw. du kannst auch einer der anderen überladenen Graphics.DrawImage-Methoden benutzen, um gleich nur den entsprechenden Ausschnitt (+ Zoom) zu erzeugen, d.h. z.B. mittels DrawImage(Image, Rectangle, Rectangle, GraphicsUnit).
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: So 10.02.13 22:52
Hm. Ich glaube, dann musst Du erst die Vektorgrafik in der richtigen Größe in ein Bitmap rendern und dann davon den entsprechenden Ausschnitt nehmen. Andersrum wird es verlustfrei nicht gehen, weil Du keine Vektoren mehr hast. Der Nachteil ist natürlich, dass Du (bevor Du einen Teil ausschneidest) unter Umständen ein verdammt großes Bitmap im Speicher hast
//edit: Ah, das mit dem "Ausschnitt erstellen" von Th69 könnte das Problem beheben 
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Christoph1972 
      
Beiträge: 690
Erhaltene Danke: 16
VS2015 Pro / C# & VB.Net
|
Verfasst: So 10.02.13 22:58
Th69 hat folgendes geschrieben : | Dann nimm einfach das in Christians Code erstellt Bitmap und wende darauf dann die "Clip-Funktion" an.
Bzw. du kannst auch einer der anderen überladenen Graphics.DrawImage-Methoden benutzen, um gleich nur den entsprechenden Ausschnitt (+ Zoom) zu erzeugen, d.h. z.B. mittels DrawImage(Image, Rectangle, Rectangle, GraphicsUnit). |
Das würde aber nur einmal funktionieren, wenn ich dann einweiters mal einen Auschnitt nehmen möchte habe ich keine Vektorgrafik mehr, sondern nur noch das Image aus der PictureBox. Ich glaube fast, das ich die Funktion wirklich immer doppelt anwenden muss. Einmal zur Darstellung in der PicBox und dann direkt an der EMF um die Vektoren zuerhalten.
_________________ Gruß
Christoph
|
|
Th69
      

Beiträge: 4807
Erhaltene Danke: 1061
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Mo 11.02.13 11:12
Hallo Christoph,
du mußt selbstverständlich immer den Ausschnitt (d.h. das Rectangle) auf das Original-Metaimage anwenden.
Also wenn du einen Ausschnitt vom Ausschnitt machst (oder noch weiter verschachtelst), immer bezogen auf das Originalbild berechnen.
Und dann brauchst du nur wieder die obige DrawImage-Methode einmalig aufrufen.
|
|
Christoph1972 
      
Beiträge: 690
Erhaltene Danke: 16
VS2015 Pro / C# & VB.Net
|
Verfasst: Mo 11.02.13 17:52
So, ich habe es jetzt! Sogar etwas einfacher als gedacht.
Die PictureBox steht auf Zoom, dieser weise ich das orginal EMF zu (ca.5000*2800). Das hatte ich vorher nicht, da wurde es zuvor skaliert(warum auch immer, Performance aus 2008?? Ich glaube damlas hat das Laden zulange gedauert), das lasse ich jetzt. Jetzt rechne ich einfach das Rectangle auf das Bild um und schneide dann neu aus. Das Ergbenis ist perfekt, ich kann belibig tief zoomen ohne Verluste zu erkennen.
By the way, wenn man die Bitmap.Save(File, System.Drawing.Imaging.ImageFormat.EMF) Methode verwendet hat man keine Vektorgrafik, die Vektoren fehlen leider. Eine Idee von mir war die Images immer temp als EMF abzulegen, das kann man aber aus diesem Grund vergessen.
_________________ Gruß
Christoph
|
|