Fehlerbehebung Hilfe! Anfänger windows.forms

Die Programmiersprache C# und Programmierung im .NET Framework/Mono
Wissenslücke
Beiträge: 35
Registriert: Mo Feb 22, 2016 6:03 pm

Fehlerbehebung Hilfe! Anfänger windows.forms

Beitrag von Wissenslücke » So Sep 08, 2019 2:32 am

hi,

ich hab ein kleines programm geschrieben welches nichtmal im ansatz funktioniert. ich kann leider den fehler nicht finden. ziel ist es einem graustufenbild farbe zu geben ohne die graustufen zu verändern.

Code: Alles auswählen

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace training
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Button2_Click(object sender, EventArgs e)
        {
            try
            {
                // grayscale bild welches farbig werden soll
                Bitmap Gray =  new Bitmap(@"C:\Users\Dell\Pictures\Gray.jpg", true);
                
                // farbiges bild (quasi farb-pallette für das grayscale bild) 
                Bitmap Color =  new Bitmap(@"C:\Users\Dell\Pictures\Color.jpg", true);
                
                // Ausgabe vom grayscale img in picturebox 
                pictureBox1.Image = Gray;

                int x = 0;
                int y = 0;

                int x2 = 0;
                int y2 = 0;
                
 
                // durchläuft pixel grayscale bild
                for (x = 0; x < Gray.Width; x++)
                {
                     for (y = 0; y < Gray.Height; y++)
                    {
                        // findet Graustufenwert für grayscale bild und speichert ihn in variable 
                        Color pixelGray = Gray.GetPixel(x, y); 
                        float grayValue = (pixelGray.R + pixelGray.G + pixelGray.B) / 3;
                        int grayValueRound = (int)Math.Round(grayValue);

                        // durchläuft pixel farbiges bild
                        for (x2 = 0; x2 < Color.Width ; x2++)
                        {   
                            for (y2 = 0; y2 < Color.Height; y2++)
                            {
                                // findet Graustufenwert für farbiges bild und speichert ihn in variable
                                Color pixelColor = Color.GetPixel(x2, y2);
                                float colorValue = (pixelColor.R + pixelColor.G + pixelColor.B) / 3;
                                int colorValueRound = (int)Math.Round(colorValue);

                                // gibt dem grayscale pixel farbe bei selbem Value
                                if (grayValueRound == colorValueRound)
                                {
                                    Gray.SetPixel(x, y, pixelColor);
                                                    
                                }

                            }
                        }

                        

                       
                    }
                    
                }
                pictureBox1.Image = Gray;
                Gray.Save("C:Pictures\\Color.bmp");
                MessageBox.Show("THE END");
            }

            catch (System.IO.FileNotFoundException)
            {
                MessageBox.Show("There was an error opening the bitmap." +
                    "Please check the path.");
            }
        }
    }
}
Danke für eure Hilfe !
Gruß

Wissenslücke
Beiträge: 35
Registriert: Mo Feb 22, 2016 6:03 pm

Re: Fehlerbehebung Hilfe! Anfänger windows.forms

Beitrag von Wissenslücke » So Sep 08, 2019 2:41 am

achso ich bekomme keine fehlermeldung. das programm friert ein

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3091
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Fehlerbehebung Hilfe! Anfänger windows.forms

Beitrag von cloidnerux » So Sep 08, 2019 10:16 am

achso ich bekomme keine fehlermeldung. das programm friert ein
Was passiert denn, wenn du den Debugger benutzt und die Ausführung unterbrichst?

Es kann auch einfach sein, dass deine schleifen ewig laufen. Für jedes Pixel des Urpsrungsbildes durchläufst du alle Pixel des anderen Bildes. Selbst bei 100 x 100 px pro Bild sind das 10^8 Schleifendurchläufe, das dauert halt seine Zeit.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Wissenslücke
Beiträge: 35
Registriert: Mo Feb 22, 2016 6:03 pm

Re: Fehlerbehebung Hilfe! Anfänger windows.forms

Beitrag von Wissenslücke » So Sep 08, 2019 1:36 pm

das stimmt das ist noch nicht perfekt. aber theoretisch sollte es doch durchlaufen. das programm friert aber ein, dh ich muss es über task manager beenden, wo es auch nach kurzer zeit als inaktiv vermerkt wird. ich werde das mal über den debugger beenden und bericht erstatten.

Wissenslücke
Beiträge: 35
Registriert: Mo Feb 22, 2016 6:03 pm

Re: Fehlerbehebung Hilfe! Anfänger windows.forms

Beitrag von Wissenslücke » So Sep 08, 2019 2:02 pm

ok also in der ausgabe habe ich die ganzen bibliotheken ...dll" geladen. Das Laden von Symbolen wurde übersprungen. Das Modul ist optimiert, und die Debugoption "Nur eigenen Code" ist aktiviert."
und zum schluss: " ...."exe" wurde mit Code -1 (0xffffffff) beendet."

Wissenslücke
Beiträge: 35
Registriert: Mo Feb 22, 2016 6:03 pm

Re: Fehlerbehebung Hilfe! Anfänger windows.forms

Beitrag von Wissenslücke » So Sep 08, 2019 2:07 pm

das color pic was ich verwende ist übrigens 200x147 pixel. also net riesig

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8502
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Fehlerbehebung Hilfe! Anfänger windows.forms

Beitrag von Xin » So Sep 08, 2019 3:53 pm

Wissenslücke hat geschrieben:
So Sep 08, 2019 2:07 pm
das color pic was ich verwende ist übrigens 200x147 pixel. also net riesig
Du hast aber vier verschachtelte Schleifen.
Also 200*147*200*147, das sind 864 Millionen Durchläufe. Das ist nichts weltbewegendes, aber immerhin.
Das ganze wächst aber in vierter Dimension.

Tipp: Lass Dir an der äußersten For-Schliefe mal die Laufvariable ausgeben und guck mal wie schnell die so läuft. Und wenn da nix läuft, dann lass die zweite For-Schleife ausgeben.

Ansonsten finde ich die Bezeichnung Color verwirrend, weil es mal Typ mal Variable ist.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3091
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Fehlerbehebung Hilfe! Anfänger windows.forms

Beitrag von cloidnerux » So Sep 08, 2019 3:56 pm

das stimmt das ist noch nicht perfekt. aber theoretisch sollte es doch durchlaufen. das programm friert aber ein, dh ich muss es über task manager beenden, wo es auch nach kurzer zeit als inaktiv vermerkt wird. ich werde das mal über den debugger beenden und bericht erstatten.
Startest du denn das Programm im Debug modus(F5 in VS)? Kannst du nicht einen Breakpoint setzen und das ganze im Single-Step durchlaufen lassen?
Redundanz macht wiederholen unnötig.
quod erat expectandum

Wissenslücke
Beiträge: 35
Registriert: Mo Feb 22, 2016 6:03 pm

Re: Fehlerbehebung Hilfe! Anfänger windows.forms

Beitrag von Wissenslücke » Mo Sep 09, 2019 8:41 pm

also ich hab jetz mal das graustufenbild auf 4 pixel reduziert und das farbbild auch verkleinert. es ist tatsächlich durchgelaufen. allerdings ist das ergebnis fern von dem was ich möchte. ich denke ich sollte das format und die qualität definiern. allerdings bleibt die frage, warum es bei größerem image einfriert. braucht das programm wirklich so viele ressourcen ?

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3091
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Fehlerbehebung Hilfe! Anfänger windows.forms

Beitrag von cloidnerux » Di Sep 10, 2019 6:56 am

also ich hab jetz mal das graustufenbild auf 4 pixel reduziert und das farbbild auch verkleinert. es ist tatsächlich durchgelaufen. allerdings ist das ergebnis fern von dem was ich möchte. ich denke ich sollte das format und die qualität definiern. allerdings bleibt die frage, warum es bei größerem image einfriert. braucht das programm wirklich so viele ressourcen ?
Es braucht nicht viele Resourcen, es braucht halt einfach lange. Du hast die vier verschachtelten Schleifen, daher steigt den Problem auch mit O(n^4). Das Programm friert ein, weil du die Prozessierung in dem Button-Callback durchführst. Der ist an den Fenster-Prozess gekoppelt und blockiert diesen, solange du Arbeitest, Windows erkennt das dann als "Eingefroren", weil sich das Programm nicht mehr zurück meldet.
Die Pixel-Zugriffe über SetPixel und GetPixel sind sau langsam, das multipliziert mit deinen 4 Schleifen gibt deinem Programm den Rest.

Du kannst dein Programm aber auch einfach anders Schreiben. Deine Idee ist ja, ein Graustufenbild einzufärben. Du hast 256 Verschiedene Graustufen(0-255), denen du einen Farbwert zuweisen willst. Statt jetzt also durch dein Farbbild zu laufen, um zufällig passende Werte zu finden, kannst du dir auch erst einmal eine "Palette" aufbauen. Das ist eine Liste, die deinen 256 Graustufen einen Farbwert zuweißt. Du Iterierst also einmal über dein Farbbild und packst die gefunden Farbwerte an die entsprechende Stelle in der Palette. Fehlende Werte lässt du entweder Grau oder interpolierst über die Nachbarn. Dann gehst du durch dien Graustufenbild und weißt den Graustufen die entsprechenden Farben zu.

Falls du versuchst ein Graustufenbild "korrekt" einzufärben ist das so einfach nicht möglich, da mehrere sehr unterschiedliche Farben auf die selbe Graustufe abgebildet werden und du ohne Kontext(Inhalts)senitive Informationen keinen Rückschluss mehr auf die Farbe ziehen kannst.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Antworten