Laden...

Bitmap verkleinern

Erstellt von Dexter vor 18 Jahren Letzter Beitrag vor 15 Jahren 5.824 Views
D
Dexter Themenstarter:in
481 Beiträge seit 2005
vor 18 Jahren
Bitmap verkleinern

Ich hab mir ein Programm geschrieben, dass über das Internet Bilder(Bitmap's) verschickt und auch empfängt, jedoch passiert das ca alle 2 Sekunden und dann würde mein Download-Volumen bald erschöpft sein. Was wäre die passenste Methode, meine Bitmap's zu verkleinern?

Dexter

//edit hab noch was vergessen. Um ein Bitmap zu erzeugen brauch ich ja ein Stream oder ne Datei. Geht es auch ohne eines der beiden??

Programmierer sind Maschinen die Koffein in Quellcode umsetzen.

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo Dexter,

jpg, gif, png, tif

herbivore

2.082 Beiträge seit 2005
vor 18 Jahren

Hallo Dexter,

nur Datei reicht auch. Das bitmap müsste eine Save Funktion haben schau mal nach. Und wenn du ein Image hast kannst du einfach eine Conversion machen.

Bitmap bmp = Image as Bitmap;
bmp.Save("Pfad");

Es ist toll jemand zu sein, der nichts von der persönlichen Meinung Anderer hält. - frisch-live.de

D
Dexter Themenstarter:in
481 Beiträge seit 2005
vor 18 Jahren

@herbivore
Ja das weiß ich, aber ich meine, ich mach mir jede 2 Sekunden n Bild vom Bildschirm und dann hab ich ne Bitmap und die versende ich dann auch, aber die ist mir zu groß.

Dexter

Programmierer sind Maschinen die Koffein in Quellcode umsetzen.

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo Dexter,

und ich meinte, dass du die Bitmap ja auch in einem der genannten Formate versenden könntest. Die Bitmap-Klasse hat beim Save die entsprechenden Optionen.

herbivore

PS:Ich würde nie auf die Idee kommen Bitmaps als Bitmap zu verschicken. 🙂

45 Beiträge seit 2004
vor 18 Jahren

Hallo,

möchtest Du die Größe des Bildes in Pixeln auch verkleinern, oder nur die Dateigröße und die Maße sollen so bleiben???

Zum skalieren der Bilder nehme ich folgendes:


        public Image GetThumbnail(Image pImage, int pSize)
        {
            int x, y;

            if (pImage.Width > pImage.Height)
            {
                x = pSize;
                y = Convert.ToInt32(((float)pImage.Height / (float)pImage.Width * pSize));
            }
            else
            {
                y = pSize;
                x = Convert.ToInt32(((float)pImage.Width / (float)pImage.Height * pSize));
            }
            Image ret = new Bitmap(x, y);
            Graphics g = Graphics.FromImage(ret);
            g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
            g.DrawImage(pImage, 0, 0, x, y);
            g.Dispose();
            return ret;
        }

Aufrufen damit:

Image bildchen= GetThumbnail((Bitmap)Bitmap.FromFile("Bilderpfad"), Bildgröße);

Danach speichere ich als .jpg so:

bildchen.Save(name, System.Drawing.Imaging.ImageFormat.Jpeg);

Die Größe die Du übergibst (Bildgröße in GetThumbnail) ist dann die verkleinerte Version des Bildes... Proportionen werden mit der funktion GetThumbnail berechnet.

Also könntest du mit der .jpg-Speicherung schon die Dateigröße verringern und wenn es nötig ist auch die Skalierung des Bildes, was noch mehr die Dateigröße verringert ...

despira.de - Thomas Claus - Taucherstr. 21 - 02625 Bautzen - Tel: 03591 / 480357 WebDesign - .Net Softwareentwicklung – Computergrafik – PC-Service
M
4 Beiträge seit 2008
vor 15 Jahren

Hallo an alle die diesen altertümlichen Thread noch aufgespürt haben.
Ich habe es schliesslich auch. Der gepostete Algorithmus hat mich erst verwirrt (weiß, dass das simpel ist und das Carmack das schon als Entspannung nach dem Bäuerchen auf seinem Etch-a-sketch austüftelte), aber dass ich drüber nachgedacht habe, kann man hoffentlich sehen.

Meine Änderungen berichtigen nicht unbedingt Schwachstellen (bis auf vielleicht durch schräge Parameter ausgelöste DivideByZeroExceptions oder NullReferenceExceptions).

Im Grunde wollte ich, dass alle Thumbnails immer eine feste Höhe haben um einer ListView ein symetrisches Aussehen zu geben. Ich glaube sagen zu können, dass imagodespira's Vorlage das nicht ganz schafft. Trotzdem danke für die Zaunpfähle mit der Faktorenrechnung und dem InterpolationMode (net ist hamma!). Ausserdem skaliert der Code auch zu kleine Bildchen auf das richtige Maß hoch.

Als zweiten Parameter gibt man die gewünschte Länge der Seite an. Will man die Höhe auf diese Länge bringen, übergibt man horizontalOrVertical=false. Will man die Breite trimmen, dort true angeben.


public static Image GetThumbnail(Image unscaledImage, int thumbnailSideLength, bool horizontalOrVertical)
		{
			int x=0, y=0, imgwidth = -1, imgheight = -1;

			if (unscaledImage == null)
				return unscaledImage;

			if (unscaledImage.Width < 1 || unscaledImage.Height < 1)
				return unscaledImage;

			imgwidth = unscaledImage.Width;
			imgheight = unscaledImage.Height;

			if (horizontalOrVertical == false)
				if (imgheight == thumbnailSideLength)
					return unscaledImage;

			if (horizontalOrVertical == true)
				if (imgwidth == thumbnailSideLength)
					return unscaledImage;

			float scaleFactor = ((float)thumbnailSideLength / ((horizontalOrVertical) ? imgwidth : imgheight));
			x = (int)((float)imgwidth * scaleFactor);
			y = (int)((float)imgheight * scaleFactor);

			Image ret = new Bitmap(x, y);
			Graphics g = Graphics.FromImage(ret);
			g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
			g.DrawImage(unscaledImage, 0, 0, x, y);
			g.Dispose();
			return ret;
		}