Feedback

C# - Bitmap in Graustufen wandeln

Veröffentlicht von am 01.06.2006
(1 Bewertungen)
Diese Funktion wandelt ein Bitmap in Graustufen um.
GFU-Schulungen  [Anzeige]

VB.NET Komplett

Sie stehen vo der Aufgabe, individuelle Anwendungen für Windows zu schreiben. Hier ist VB.NET die optimale Sprache. Sie erlernt sich recht leicht und passt sich komplett in die .NET Umgebung von Microsoft ein. Nach der Schulung entwickeln Sie anwenderfreundliche Programme in VB.NET . Mit den objektorientierten Modellen in VB.NET erzeugen Sie außerdem wiederverwendbare Komponenten.

VB.NET 2017/2015/2013 Aufbau

Nach dieser Schulung können Sie mittels objektorientierter Modelle in VB.NET 2017/2015/2013 wiederverwendbare Elemente eigenständig erstellen.

using System.Drawing; 

private Bitmap BildSW(Bitmap Bild)
{
	Color PixRGB;
	Color PixSW;
	int temp;
	for (int sp = 0; sp < Bild.Width; sp++)
	{
		for(int zei = 0; zei < Bild.Height; zei++)
		{
			PixRGB = Bild.GetPixel(sp,zei);
			temp = (PixRGB.R + PixRGB.G + PixRGB.B)/3;
			PixSW = Color.FromArgb(temp,temp,temp);
			Bild.SetPixel(sp,zei,PixSW);
		}
	}
	return Bild;
}
Abgelegt unter Bitmap, Graustufen, sw, schwarz, weiss, jpg.

2 Kommentare zum Snippet

herbivore schrieb am 09.12.2006:
Das Auge nimmt die Farben der einzelnen Farbkanäle auch bei gleichen Beträgen unterschiedlich hell wahr. Deshalb berechnet man normalerweise einen gewichteten Durchschnitt. In der Bildbearbeitung GIMP wird folgende Formel verwendet: Y = 0.3R + 0.59G + 0.11B. Das Y nennt man auch die Leuchtkraft der Farbe.

Davon abgesehen arbeiten GetPixel und SetPixel sehr langsam. Hier könnte die Verwendung von Bitmap.LockBits zu einer erheblichen Beschleunigung führen.
M1C schrieb am 13.09.2009:
Ich hab mich mal an die Lockbits gesetzt^^
währe schön wenn du das nach oben einfügst. =)


private Bitmap BildSW(Bitmap bmp)
{
int numBytes = bmpData.Stride * bmp.Height;
byte[] rgbValues = new byte[numBytes];
int tmpSW;

PixelFormat pxf = PixelFormat.Format24bppRgb;

Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
BitmapData bmpData = bmp.LockBits(rect, ImageLockMode.ReadWrite, pxf);

IntPtr ptr = bmpData.Scan0;

Marshal.Copy(ptr, rgbValues, 0, numBytes);

for(int counter = 0; counter < rgbValues.Length; counter+=3)
{
tmpSW = rgbValues[counter];
tmpSW += rgbValues[counter+1];
tmpSW += rgbValues[counter+2];

tmpSW /= 3;

rgbValues[counter] = rgbValues[counter+1] = rgbValues[counter+2] = Convert.ToByte(tmpSW);
}

Marshal.Copy(rgbValues, 0, ptr, numBytes);

bmp.UnlockBits(bmpData);

return bmp;
}
 

Logge dich ein, um hier zu kommentieren!