Bilder Zoomen ?

Asterix-Ac

Erfahrenes Mitglied
Hi Community,

ich habe TestProjekt gemacht, mit dem ich Bilder zoomen will.
D.h. das urspüngliche Bild soll nicht vergrößert oder verkleinert werden.
Mein Problem dabei ist, dass das hineingeladene Image (auf einer PictureBox)
permanent da ist(also nicht ersetzt wird) und mein gezoomtes Image (auf einem Graphics Kontext) nach dem ausführen der Methode verlohen geht. Ich habe aber keine Idee, wie es funktionieren könnte.
Nachfolgend poste ich mal den kompletten Code.
Vielleicht hat jemand eine Idee, wie man es lösen könnte.

Danke schonmal im Vorraus.

Asterix :confused:

Code:
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;

namespace zoomTest
{
	/// <summary>
	/// Zusammendfassende Beschreibung für Form1.
	/// </summary>
	public class Form1 : System.Windows.Forms.Form
	{
		private Rectangle rect;
		private System.Windows.Forms.PictureBox pictureBox1;
		private System.Windows.Forms.OpenFileDialog ofd;
		private System.Windows.Forms.SaveFileDialog sfd;
		private System.Windows.Forms.MainMenu mainMenu1;
		private System.Windows.Forms.MenuItem menuItem1;
		private System.Windows.Forms.MenuItem menuItem2;
		private System.Windows.Forms.MenuItem menuItem3;
		private System.Windows.Forms.Button button1;
		private System.Windows.Forms.Button button2;
		/// <summary>
		/// Erforderliche Designervariable.
		/// </summary>
		private System.ComponentModel.Container components = null;

		public Form1()
		{
			//
			// Erforderlich für die Windows Form-Designerunterstützung
			//
			InitializeComponent();

			//
			// TODO: Fügen Sie den Konstruktorcode nach dem Aufruf von InitializeComponent hinzu
			//
		}

		/// <summary>
		/// Die verwendeten Ressourcen bereinigen.
		/// </summary>
		protected override void Dispose( bool disposing )
		{
			if( disposing )
			{
				if (components != null) 
				{
					components.Dispose();
				}
			}
			base.Dispose( disposing );
		}

		#region Windows Form Designer generated code
		/// <summary>
		/// Erforderliche Methode für die Designerunterstützung. 
		/// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden.
		/// </summary>
		private void InitializeComponent()
		{
			this.pictureBox1 = new System.Windows.Forms.PictureBox();
			this.ofd = new System.Windows.Forms.OpenFileDialog();
			this.sfd = new System.Windows.Forms.SaveFileDialog();
			this.mainMenu1 = new System.Windows.Forms.MainMenu();
			this.menuItem1 = new System.Windows.Forms.MenuItem();
			this.menuItem2 = new System.Windows.Forms.MenuItem();
			this.menuItem3 = new System.Windows.Forms.MenuItem();
			this.button1 = new System.Windows.Forms.Button();
			this.button2 = new System.Windows.Forms.Button();
			this.SuspendLayout();
			// 
			// pictureBox1
			// 
			this.pictureBox1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
			this.pictureBox1.Location = new System.Drawing.Point(16, 24);
			this.pictureBox1.Name = "pictureBox1";
			this.pictureBox1.Size = new System.Drawing.Size(292, 244);
			this.pictureBox1.TabIndex = 0;
			this.pictureBox1.TabStop = false;
			// 
			// sfd
			// 
			this.sfd.FileName = "doc1";
			// 
			// mainMenu1
			// 
			this.mainMenu1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
																					  this.menuItem1});
			// 
			// menuItem1
			// 
			this.menuItem1.Index = 0;
			this.menuItem1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
																					  this.menuItem2,
																					  this.menuItem3});
			this.menuItem1.Text = "Datei";
			// 
			// menuItem2
			// 
			this.menuItem2.Index = 0;
			this.menuItem2.Text = "Load Image";
			this.menuItem2.Click += new System.EventHandler(this.menuItem2_Click);
			// 
			// menuItem3
			// 
			this.menuItem3.Index = 1;
			this.menuItem3.Text = "Save Image";
			// 
			// button1
			// 
			this.button1.Location = new System.Drawing.Point(76, 0);
			this.button1.Name = "button1";
			this.button1.TabIndex = 1;
			this.button1.Text = "ZoomIn";
			this.button1.Click += new System.EventHandler(this.button1_Click);
			// 
			// button2
			// 
			this.button2.Location = new System.Drawing.Point(160, 0);
			this.button2.Name = "button2";
			this.button2.TabIndex = 2;
			this.button2.Text = "ZoomOut";
			this.button2.Click += new System.EventHandler(this.button2_Click);
			// 
			// Form1
			// 
			this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
			this.ClientSize = new System.Drawing.Size(476, 317);
			this.Controls.AddRange(new System.Windows.Forms.Control[] {
																		  this.button2,
																		  this.button1,
																		  this.pictureBox1});
			this.Menu = this.mainMenu1;
			this.Name = "Form1";
			this.Text = "Form1";
			this.Load += new System.EventHandler(this.Form1_Load);
			this.ResumeLayout(false);

		}
		#endregion

		/// <summary>
		/// Der Haupteinstiegspunkt für die Anwendung.
		/// </summary>
		[STAThread]
		static void Main() 
		{
			Application.Run(new Form1());
		}

		

		private void menuItem2_Click(object sender, System.EventArgs e)
		{
			if(ofd.ShowDialog() == DialogResult.OK)
			{
				this.pictureBox1.Image = Image.FromFile(ofd.FileName);
				this.pictureBox1.Size = new Size(this.pictureBox1.Image.Width,this.pictureBox1.Image.Height);
			}
		}
//hier zoome ich rein
		private void button1_Click(object sender, System.EventArgs e)
		{
			Graphics g = this.pictureBox1.CreateGraphics();
			this.pictureBox1.Size = new Size(this.pictureBox1.Width+10,this.pictureBox1.Height+10);
			rect = new Rectangle(0,0,this.pictureBox1.Width+10,this.pictureBox1.Height+10);
			g.DrawImage(this.pictureBox1.Image,rect);
//                      this.pictureBox1.Refresh();
			this.Invalidate();
		}
//hier zoome ich raus
		private void button2_Click(object sender, System.EventArgs e)
		{
			Graphics g = this.pictureBox1.CreateGraphics();
			this.pictureBox1.Size = new Size(this.pictureBox1.Width-10,this.pictureBox1.Height-10);
			rect = new Rectangle(0,0,this.pictureBox1.Width-10,this.pictureBox1.Height-10);
			g.DrawImage(this.pictureBox1.Image,rect);
//                      this.pictureBox1.Refresh();			
			this.Invalidate();
		}

		private void Form1_Load(object sender, System.EventArgs e)
		{
		
		}

	}
}
 

sra

Erfahrenes Mitglied
Hallo

Poste doch bitte jeweils nur der Teil Code, der wirklich wichtig ist, und die anderen 100 Zeilen nicht auch noch. Und wenn du deine Buttons und Co einigermassen sinnvoll benennen würdest (btnZoomIn, btnZoomOut,...), dann wäre es auch gleich um einiges leichter deinen Code zu lesen!

Ich habe nur kurz mal ein Auge drauf geworfen, und denke es könnte daran liegen, dass du das ganze etwas "falsch" angehst (muss nicht daran liegen, solltest du aber trotzdem beachten!)

Du versuchst beim Button1_Click das Bild zu verändern. Stattdessen solltest du beim onPaint Ereignis der PictureBox das Bild neu laden, nach den Parametern (oder eher Eigenschaften), welche du bei Button1_Click setzt.

Im onPaint Ereignis hast du dann auch ein e.Graphics zur verfügung, welches das bisherige Bild repräsentiert. Das brauchst du auch, wenn du das Form zB minimierst, und es danach wieder lädst.

Gruss de sra
 

Asterix-Ac

Erfahrenes Mitglied
Hi,

ja, Du hast recht, ich sollte nicht den ganzen Code posten.
Die benennung habe ich nicht beachtet, da es für mich eh ein Test-Projekt ist.
Die eigentliche Funktion kommt später in ein anderes Projekt. Aber die Analyse hier wird dadurch wiederum schwerer.

Ich werde die OnPaint Methode überschreiben und mal schauen, wie ich es hinbekomme.

Falls nicht, poste ich nochmal.

Danke vorerst.

Asterix
 

mchashi

Mitglied
du solltest auch aus der zoomIn und zoomOut funktion eine machen, der du nur einen Parameter übergibst (zoom - z.B: +10 oder -10)