2016-12-15 3 views
-1

Ich habe 2 Fragen:Wie bekomme ich den Anzeigebereich eines Bildes in eine Bildbox?

  1. Wie in einem Bildfeld mit einem Skalierungsfaktor, den Anzeigebereich eines Bildes bekommen?
    • Beispiel:
      • Ich habe ein Bild (1000 x 1000), meine Aufgabe ist "eine Fläche erhalten (600 x 600) des Bildes".
      • Ich erstelle ein Formular, dann ein Panel mit einer Bildbox innen, Bild Boxgröße ist 400 x 400, machen Sie etwas Code, um den Benutzer zu ermöglichen, Bild in das Feld zu ziehen
      • Ich lade das Bild in die Bilderbox. Da der gewünschte Bereich 600 x 600 ist, aber meine Box nur 400 x 400 ist, skaliere ich das Bild mit dem Faktor 0,67.
      • Der Benutzer wählt den gewünschten Bereich aus, indem er das Bild umherzieht.
    • Wie bekomme ich diesen Bereich (vom Originalbild)?
  2. Und wenn ich den Benutzer in dieser Bildbox hinein-/herauszoomen lasse, wie kann ich damit umgehen?
+0

Was hast du versucht. Kannst du deinen Code posten? –

+0

@ γηράσκωδ'αείπολλάδισασκόμε Ich weiß nicht, wo ich anfangen soll. Meine aktuelle Lösung ist die Control.DrawToBitmap-Funktion, aber ich denke, es ist nicht der richtige Weg. – haiduong87

+0

Es ist eine Menge Arbeit. Ich gebe Ihnen einen Hinweis für die erste –

Antwort

1

Da das Bild in picbox skaliert wird, können Sie den Bereich nicht nehmen direkt von PicBox. Der Trick ist un-scale das Rechteck, dass der Benutzer auswählen und transformieren sie zum Original.

Sie müssen zwei Bilder:

Bitmap original600x600; //unscaled 
Bitmap picBoxImage; //with 400x400 dimensions 

, wenn Ihr Formular geladen:

original600x600 = new Bitmap(600, 600); 
//Draw the portion of your 1000x1000 to your 600x600 image 
.... 
.... 

//create the image of your pictureBox 
picBoxImage= new Bitmap(400, 400); 

//scale the image in picBoxImage 
Graphics gr; 

gr = Graphics.FromImage(picBoxImage); 

gr.DrawImage(original600x600, new Rectangle(0, 0, 400, 400)); 

gr.Dispose(); 
gr = null; 

pictureBox1.Image = picBoxImage; //If at any time you want to change the image of 
           //pictureBox1, you dont't draw directly on the control 
           //but on picBoxImage and then Invalidate() 

Wenn der Benutzer ein Rechteck auswählen, rufen lässt es rectangleSelect, auf pictureBox1 Sie x, y, width, height des Rechtecks ​​zu transformieren müssen das Original, das 600x600. Sie brauchen etwas einfache Mathematik:

//scaled     unscaled    with precision 
x  becomes -----------> x * (600/400)  (int)((double)x * (600D/400D)) 
y  becomes -----------> y * (600/400)  (int)((double)y * (600D/400D)) 
width becomes -----------> width * (600/400) (int)((double)width * (600D/400D)) 
height becomes -----------> height * (600/400) (int)((double)height * (600D/400D)) 

Hoffe, das hilft ein wenig!

+0

Vielen Dank, Ich habe Ihre Idee für die erste Frage, ich kann es zur Arbeit jetzt machen Über die zweite Frage, ich denke, es ist das gleiche wie die erste Frage, aber ich brauche mit dem 2. Skalierungsfaktor etwas mehr Mathe zu machen. Ich entwickle eine Foto-Collage-Anwendung, diese 2 Fragen ist ein Schritt in den endgültigen Prozess. – haiduong87

+0

@ haiduong87 Es hängt davon ab, was Zoomen Sie erreichen möchten. Wenn Sie einfach hineinzoomen möchten, ist es einfach. Aber wenn Sie eine ausgewählte Portion picbox hineinzoomen wollen, dann braucht es etwas Arbeit –

Verwandte Themen