Bildbearbetungsprogramm - Verbesserungen, kleine Fehler



  • Natürlich, sollte eine Double-Zahl sein; gibt ein Rundungsfehler, mit der Multiplikation wird dieser dann auch vergrössert.
    Die erste Version des Programmes, konnte nur skalieren, wurde innerhalb weniger Wochen 1500 Mal heruntergeladen und die Sterne für die Nutzerzufriedenheit zeigten immer einen schwankenden Wert von 70-80% an (anscheinend haben einige der Leute bewertet sonst hätte der Wert nicht geschwankt); ist ja nicht schlecht! Die sehen natürlich den Code nicht, aber vielleicht waren diese zufrieden wegen der Einfachheit.

    Zum Exception-Handling; was ist daran schlecht? Die für Benutzer unverständliche Message? "Zu wenig Arbeitsspeicher" ist ja OK; klar wenn kein Bild geöffnet wurde steht etwas von Objektinstanz, aber wenn man nicht selbst darauf kommt dass man ein Bild welches nicht da ist nicht bearbeiten kann...

    GC.Collect(), ich weiss es kann Zeit brauchen dies abzuarbeiten; ich dachte nur um während der Laufzeit möglichst bald wieder neuer Arbeitsspeicher zu beschaffen, da ich gemerkt habe dass das der Schwachpunkt meines Programmes ist; wobei bei 512 Mb RAM geht es i.d.R gut.



  • C. M. Obrecht schrieb:

    GC.Collect(), ich weiss es kann Zeit brauchen dies abzuarbeiten; ich dachte nur um während der Laufzeit möglichst bald wieder neuer Arbeitsspeicher zu beschaffen, da ich gemerkt habe dass das der Schwachpunkt meines Programmes ist; wobei bei 512 Mb RAM geht es i.d.R gut.

    Dann solltest du nach der Ursache des Problems suchen und nicht nur die Symptome bekämpfen. Für mich hört sich das nach einem Memory-Leak an.



  • O.o schrieb:

    Dann solltest du nach der Ursache des Problems suchen und nicht nur die Symptome bekämpfen. Für mich hört sich das nach einem Memory-Leak an.

    So ein Blödsinn!
    Hab ich ja wohl noch nie gehört.
    Memory-Leak.
    Guck da mal, lesen kannst Du ja wohl?

    http://de.wikipedia.org/wiki/Speicherleck



  • C. M. Obrecht schrieb:

    O.o schrieb:

    Dann solltest du nach der Ursache des Problems suchen und nicht nur die Symptome bekämpfen. Für mich hört sich das nach einem Memory-Leak an.

    So ein Blödsinn!
    Hab ich ja wohl noch nie gehört.
    Memory-Leak.
    Guck da mal, lesen kannst Du ja wohl?

    http://de.wikipedia.org/wiki/Speicherleck

    Was möchtest Du mit dem Link sagen?
    Simon



  • Wahrscheinlich will er damit sagen, dass er noch nicht mitbekommen hat, dass es auch in Zeiten von GC Memory-Leaks gibt und dass er es für normal hält, dass ein einfaches Bildbearbeitungsprogramm fast 500 MB Arbeitsspeicher verbraucht ...



  • C. M. Obrecht schrieb:

    Hab ich ja wohl noch nie gehört.

    Willst Du damit jetzt ernsthaft behaupten, daß Aussagen, von denen Du noch nie gehört hast automatisch falsch sein müssen?

    Dein ganzer Code ist voller kleiner und großer Fehler, sowohl Design als auch Logikfehler als auch Programmierfehler...

    Beispiel: Wenn Du Dich fragst warum deine Bildqualität nach "Verkleinern" auf einmal schlecht wird, dann schau Dir mal diese Stelle solange an, bis Du verstehst was Du da falsch machst...

    zielbild = (Bitmap)bild.GetThumbnailImage(width, height, null, IntPtr.Zero);
    bild = zielbild;
    

    und beim Drucken machst Du

    Image oImage = (b.GetBitmap() as Image);
    
                Point p = new Point(e.MarginBounds.Left, e.MarginBounds.Top);
                if (oImage != null)
                {
                    Rectangle r = new Rectangle(p.X, p.Y, pTemp.X, pTemp.Y);
    
                    gr.DrawImage(oImage, r);
    
                }
    

    Klar das die Ausdrucke dann Scheisse aussehen, oder?

    Ausserdem:

    Graphics gr = e.Graphics;
       gr.Dispose();
    

    Dir ist schon klar das das ein schwerer Fehler ist? Du zerstörst hier ein Graphics Objekt das vom Framework verwaltet wird -> bad idea.

    Dein ganzer Code zeigt das Du vom Memory-Management des Frameworks keine Ahnung hast... Noch ein Beispiel? Da:

    Bitmap tmp = b.GetBitmap();
       tmp.Save(saveFileDialog1.FileName);
       //tmp.Dispose();
       GC.Collect();
    

    Das würde Sinn machen wenn GetBitmap eine Kopie anlegt, tut es aber nicht:

    Bitmap bild;
       public Bitmap GetBitmap()
       {
           return bild;
       }
    

    GC.Collect bringt an dieser Stelle absolut gar nichts und Dispose würde das interne Objekt der Klasse zerstören...

    btw: schonmal was von Properties gehört? Oder fällt das auch unter: Hab ich noch nie von gehört, gibt es also nicht.



  • Ist es da eigentlich üblich dass andere unter dem Namen des Threadstarters schreiben!? Der 3. Post ist definitiv nicht von mir.
    Die Bilder sehen nicht schlecht aus nach dem Verkleinern (nur so wie es natürlich normal ist kleiner=schlechter) und die Ausdrucke sehen meist auch OK aus; nur bei wenigen Bildern (mit bestimmten Werten denke ich) nicht, und bei namchen sieht das Bild auf dem Bildschirm solange schlecht aus bis einmal verkleinern/vergrössern angeklickt wird. Wie wenn sich die Anzeige aktualisieren müsste...

    Wegen dem dispose und gc. Collect(), ja klar ich dachte es wäre eine Kopie doch das Objekt muss ja noch vorhanden sein weil in diesem Sinne ein Zeiger zurückgegeben wird (habe ich erst kürzlich im Zusammenhang mit C++ gelesen).



  • Ist es da eigentlich üblich dass andere unter dem Namen des Threadstarters schreiben!? Der 3. Post ist definitiv nicht von mir.

    Du könntest Dich registrieren, dann passiert das nicht mehr.
    Simon



  • C.M.Obrecht schrieb:

    Wegen dem dispose und gc. Collect(), ja klar ich dachte es wäre eine Kopie doch das Objekt muss ja noch vorhanden sein weil in diesem Sinne ein Zeiger zurückgegeben wird (habe ich erst kürzlich im Zusammenhang mit C++ gelesen).

    Falsch. Selbst wenn ein Zeiger zurückgegeben würde, wäre dies keine Kopie des Objektes. Jedoch arbeitet C# mit REFERENZEN (jaja, so ähnlich wie Zeiger, aber eben nur so ähnlich). Du kannst 1000 Referenzen auf ein Objekt haben, es ist immer noch nur genau ein Objekt. Solange noch eine Referenz existiert lebt das Objekt weiter. Sind alle Referenzen weg, wird das Objekt (früher oder später) abgeräumt. Lernt ihr Kinder denn nichts über GCs?

    C.M.Obrecht schrieb:

    Die Bilder sehen nicht schlecht aus nach dem Verkleinern (nur so wie es natürlich normal ist kleiner=schlechter) und die Ausdrucke sehen meist auch OK aus; nur bei wenigen Bildern (mit bestimmten Werten denke ich) nicht, und bei namchen sieht das Bild auf dem Bildschirm solange schlecht aus bis einmal verkleinern/vergrössern angeklickt wird. Wie wenn sich die Anzeige aktualisieren müsste...

    Ok, dann muß ich Dir doch wohl erklären was Dein Programm an der Stelle macht.

    Kurz: Du ersetzt das Originalbild (volle Auflösung, optimale Qualität) durch das Thumbnail (geringe Auflösung, niedrige Qualität).

    Je nach Format haben Bilder ein zusätzliches Thumbnail gespeichert in der Größe 120x120. Wenn Du jetzt GetThumbNail(800,400) benutzt wird das 120x120 Thumbnail des Bildes genommen und hochskaliert, ergo Schrott Bildqualität.

    Wenn kein explizites Thumbnail vorhanden ist (je nach Bildformat) dann wird tatsächlich ein echtes Thumbnail erzeugt in der gewünschten Auflösung indem das Originalbild herunterskaliert wird -> Ergo gute Bildqualität.

    Woher ich das weis? Nennt sich MSDN Dokumentation...

    Was lernen wir daraus: Man sollte eine Funktion nicht zu anderen Zwecken mißbrauchen als sie gedacht ist. GetThumbNail ist numal nur genau dazu zu gebrauchen das man ein Thumbnail mit niedriger Qualitöt erzeugt. Du mißbrauchst die Funktion um damit Bilder von beliebiger Größe zu produzieren. Dafür ist es aber nicht gedacht.



  • theta schrieb:

    Ist es da eigentlich üblich dass andere unter dem Namen des Threadstarters schreiben!? Der 3. Post ist definitiv nicht von mir.

    Du könntest Dich registrieren, dann passiert das nicht mehr.
    Simon

    Ode rmachs wie ich, sei ein Arschloch. Dann will keiner unter Deinem Namen posten 😉



  • Ja registrieren werde ich mich nächstens müsen; passierte mir hier nicht das erste Mal.

    Vielen Dank! Ich kannte die Klassen eben nicht wirklich (hatte 2 Kurse über Grundlagen von C# aber nicht über .NET das kommt erst), und als ich mich erkundigte wie ein Bild zu skalieren sei wurde GetThumbnail gezeigt; ich wunderte mich schon! Alles klar, bei den Bildern die schlecht bleiben, bei denen ist ein Thumbnail vorhanden!

    Gibt es denn eine Methode um das Bild korrekt zu skalieren?



  • So jetzt bin ich mal registriert 🙂


Anmelden zum Antworten