Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Bitmap verkleinern
Dexter
myCSharp.de - Member



Dabei seit:
Beiträge: 481
Herkunft: Österreich, Vlbg

Themenstarter:

Bitmap verkleinern

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo Dexter,

jpg, gif, png, tif

herbivore
private Nachricht | Beiträge des Benutzers
frisch
myCSharp.de - Member

Avatar #avatar-1724.gif


Dabei seit:
Beiträge: 2.082
Herkunft: Coburg / Oberfranken

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Dexter
myCSharp.de - Member



Dabei seit:
Beiträge: 481
Herkunft: Österreich, Vlbg

Themenstarter:

beantworten | zitieren | melden

@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.
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

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. :-)
private Nachricht | Beiträge des Benutzers
imagodespira
myCSharp.de - Member

Avatar #avatar-2110.jpg


Dabei seit:
Beiträge: 45
Herkunft: Bautzen ( Sachsen )

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Malfunc
myCSharp.de - Member



Dabei seit:
Beiträge: 4
Herkunft: Bielefeld

beantworten | zitieren | melden

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;
		}
private Nachricht | Beiträge des Benutzers