kanku Geschrieben 2. Juni 2015 Geschrieben 2. Juni 2015 Hallo liebe Community! Ich möchte in C# ein Histogram erstellen, dass den Farbverlauf (rot, gelb, blau ; jeweils einzeln) von dunkel zu hell darstellt. Dies soll auf Grundlage eines Fotos passieren. Mir fehlt der richtige Ansatz bzw. Vorgehensweise.:confused: Könnt ihr mir helfen? Danke schonmal! Zitieren
Goulasz Geschrieben 3. Juni 2015 Geschrieben 3. Juni 2015 Sowas? Falls ja, ist bei mir der erste Google Hit zu "create histogram from picture c#". Zitieren
Pointerman Geschrieben 3. Juni 2015 Geschrieben 3. Juni 2015 Moin! Der Ansatz sollte von Dir kommen. Hier mal ein paar Anstöße: 1.) Wie willst Du die Daten für die Histogramme sammeln? 2.) Was musst Du vor dem Sammeln mit dem Bild tun? 3.) Was musst Du tun um aus einem Bild (oder einer beliebiegen Menge an Werten) ein Histogramm zu erstellen? Falls Du noch Fragen hast, nachdem Du Dir die o.g. Punkte beantwortet hast, einfach fragen. Zitieren
kanku Geschrieben 3. Juni 2015 Autor Geschrieben 3. Juni 2015 Vielen Dank für die Antworten! @Goulasz : Klar, ich hab auch einige Dinge beim googlen gefunden. Diese verstehe ich aber nicht sonst würde ich hier nciht fragen;) @Pointerman : 1) Die Daten sollten ja im besten in Arrays gespeichert werden. 2) Das Bild muss ja erstmal gelesen werden 3) Weiß ich leider nicht. Die Grundideen hab ich jetzt. Nur die Umsetzung macht mir so einige Probleme. Meine Ansätze sehen folgendermaßen aus(nur grob, kein richtiger Quellcode!!). class erstellen. in der class: steamreader, static Color[,] ArrayBitmap (Bitmap Bild), int Breite , int Höhe, Color[,] c= new Color[breite, Höhe]. for (int i=0;i<Höhe;i++){ for(int j =0;j<=;j++) c[j,i]= Miami.GetPixel(j,i)} return c; Class hier zuende! Danach zweite class: static Bitmap BitmapArry ( Color [,] Farbe) , int Breite = Farbe.GetLength(0), int Höhe =Farbe.GetLength(0), für Rote Farbe z.B. : Bitmap Rot= new Bitmap (Breite,Höhe); for(int i=0; i<0;i++){ for(int j =0;j<=;j++){Rot.SetPixel(j,i,Farbe[j,i])}} return Rot; kann ich das so für alle Farben machen? Ist das so der richtige Ansatz? Zitieren
Pointerman Geschrieben 4. Juni 2015 Geschrieben 4. Juni 2015 Das mit den Arrays klingt doch schon gut. Du brauchst also drei Arrays. Sie müssen so groß sein, dass sie jeweils alle Werte eines Kanals aufnehmen können. Im Falle eines Bildes mit 8Bit pro Kanal also 256 Elemente groß. Wie Du ein Bild einliest solltest Du schnell ergoogeln können. Wenn Du das Bild geladen hast, musst Du über alle Pixel des Bildes iterieren und Dir die Farbe des Pxiels holen (Tip: Bitmap.GetPixel). Wenn Du den Color-Wert des Pixels hast, kannst Du über die member R, G und B die jeweiligen Farbwerte auslesen und erhöhst für den jewiligen Wert das entsprechende Element im Array. Zitieren
kanku Geschrieben 5. Juni 2015 Autor Geschrieben 5. Juni 2015 Ich weiß nicht, wie ich das mit den Array umsetzen kann. Könntest du mir vielleicht einen beispielhaften Quellcode zeigen? Du scheinst dich schließlich sehr gut auszukennen. Damit würdest du mir sehr helfen! Zitieren
Pointerman Geschrieben 5. Juni 2015 Geschrieben 5. Juni 2015 Ich denke, dass es Dir nicht hilft, wenn ich Dir gleich das fertige Programm gebe. Aber ersteinmal zu den Arrays: Wie gesagt brauchst Du für jede Farbe ein Array mit genug Elementen, um für jeden Farbkanal alle Werte abzudecken. Wenn wir der einfachheit halber von 24 bzw 32Bit Farbtiefe ausgehen, dann haben wir 8Bit pro Kanal und brauchen daher 256 Elemente in den Arrays: var valuesPerPixel = 256; var redHistogram = new int[valuesPerPixel ]; var greenHistogram = new int[valuesPerPixel ]; var blueHistogram = new int[valuesPerPixel ]; Jetzt mir zwei verschachtelte Schleifen (X und Y) über alle Pixel des Bildes laufen und die Farbe des Pixels abfragen. Wie oben schon gesagt, kommst Du an die rot, grün und blau Anteile heran. Wenn z.B. Der Blauanteil den Wert 55 hat, dann musst Du das 55. Element Deines Blauhistogramms erhöhen: blueHistogram[colorVal.B]++; Zitieren
kanku Geschrieben 5. Juni 2015 Autor Geschrieben 5. Juni 2015 Danke! Das Problem ist das ich das Programm ohne "var" schreiben muss. Daher halfen mir die im Internet zu findenden Quellcodes nicht weiter... Zitieren
mfk'); DROP TABLE Users;-- Geschrieben 5. Juni 2015 Geschrieben 5. Juni 2015 Dir ist klar, dass du statt var einfach nur den konkreten Typ hinschreiben kannst? Zitieren
kanku Geschrieben 5. Juni 2015 Autor Geschrieben 5. Juni 2015 Nein, dass war mir nicht klar! Es wäre sehr hilfreich wenn ich einmal den kompletten Quellcode bekommen könnte. Ich hab sonst überhaupt keinen Überblick wo was hin muss.. Zitieren
Pointerman Geschrieben 5. Juni 2015 Geschrieben 5. Juni 2015 Sinn des ganzen sollte sein, dass Du Dir selbst gedanken machst, wie Du das Problem lösen kannst. Tips, wie Du vorgehen kannst hast Du ja schon bekommen. Wenn es dazu Fragen gibt, dann einfach fragen. Sinnvoller wäre es, wenn Du Deinen Code zeigen würdest (an die Codetags denken) und wir Dir dann weiterhelfen. Zitieren
kanku Geschrieben 5. Juni 2015 Autor Geschrieben 5. Juni 2015 Ja das verstehe ich. Hätte nur gerne einen Überblick gehabt. Ich schick gleich meinen bisherigen Code Zitieren
kanku Geschrieben 5. Juni 2015 Autor Geschrieben 5. Juni 2015 class ArrayausBitmap { StreamReader reader = new StreamReader("Bild"); static Color[,] ArrayBitmap (Bitmap Bild) { int Breite = Bild.Width; int Höhe = Bild.Height; Color[,] c = new Color[breite, Höhe]; for (int i = 0; i < Höhe; i++) { for (int j = 0; j < Höhe; j++) { c[j, i] = Bild.GetPixel(j, i); } } return c; } } class BitmapausArray { static Bitmap BitmapausArray(Color[,] Farbe) { int Breite = Farbe.GetLength(0); int Höhe = Farbe.GetLength(0); Bitmap Rot = new Bitmap(Breite, Höhe); for (int i = 0; i < 0; i++) { for (int j = 0; j < 0; j++) { Rot.SetPixel(j,i,Farbe[j,i]); } } return Rot; } } class Program { static void Main(string[] args) { System.Windows.Forms.OpenFileDialog dlg = new System.Windows.Forms.OpenFileDialog(); System.Windows.Forms.DialogResult res = dlg.ShowDialog(); if (res == System.Windows.Forms.DialogResult.OK) // Wurde „Öffnen“ geklickt? { string file = dlg.FileName; } Bitmap Bild = new Bitmap; Graphics g = Graphics.FromImage(Bild); g.Clear(Color.White); g.DrawLine(new Pen(Color.Red, 2),0,0,100.5f, 100.5f); g.Dispose(); Color c = ; byte r = c.R; byte gr = c.G; byte b = c.B; Console.WriteLine("Zum Beenden bel. Taste drücken!"); Console.ReadKey(); Zitieren
Pointerman Geschrieben 5. Juni 2015 Geschrieben 5. Juni 2015 Vom Histogramm ist da ja noch nichts zu sehen. Ich habe mir das einlesen des Bildes einfacher gemacht: Image image = Bitmap.FromFile(dlg.FileName); Bitmap bmp = new Bitmap(image); Schon hast Du das Bild von der Platte in die Bitmap geladen und kannst darauf arbeiten. Was willst Du mit ArrayToBitmap und BitmapToArray erreichen? Zitieren
kanku Geschrieben 5. Juni 2015 Autor Geschrieben 5. Juni 2015 Aber so wie du das gemacht hast kann man dann doch kein beliebiges Bild auswählen oder? Ich wollte i Prinzip erst die Werte "einlesen" und dann wieder ausgeben in Form des Histograms. Zitieren
Pointerman Geschrieben 5. Juni 2015 Geschrieben 5. Juni 2015 Warum denn nicht? Mit Bitmap.FromFile(dlg.FileName); würde doch die Datei mit dem entsprechenden Namen als Image geladen werden und nach Bitmap bmp = new Bitmap(image); kannst Du dann einfach auf die Bitmap zugreifen und alle Methoden der Bitmap-Klasse verwenden. Wenn Du also die Bitmap hast kannst Du Dich an den interessanten Teil machen, nämlich das bzw. die Histogramme erstellen. Von der Bitmap bekommst Du die benötigten Informationen wie Höhe und Breite, mit denen Du dann die Schleifen "bestücken" kannst. In den Schleifen wanderst Du über alle Pixel und kannst Dort mit getPixel die Farbwerte auslesen. Zitieren
kanku Geschrieben 5. Juni 2015 Autor Geschrieben 5. Juni 2015 Ich wollte es so haben das wenn man das Program startet ein Dialog kommt wo an dann eine beliebige Datei auswählen kann. Ok ich werds dann mal versuchen! Zitieren
kanku Geschrieben 6. Juni 2015 Autor Geschrieben 6. Juni 2015 Ich habe es versuch, bin aber nicht weit gekommen. Das:var valuesPerPixel = 256; var redHistogram = new int[valuesPerPixel ]; var greenHistogram = new int[valuesPerPixel ]; var blueHistogram = new int[valuesPerPixel ]; habe ich eingefügt und var durch int erseztzt. Das ganze habe ich in eine neue class getan. "valuesPerPixel" wird rot unterkringelt. Was muss ich tun? Zitieren
Pointerman Geschrieben 6. Juni 2015 Geschrieben 6. Juni 2015 Bitte noch einmal den aktuellen Quellcode schicken. Bitte den Code zwischen die Codetags [C O D E] und [/ C O D E] (Leerzeichen weglassen) schreiben, das erhöht die Lesbarkeit. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.