[.NET] Bild-Resize in Konsolenanwendung?

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von foxi, 9. September 2008 .

Schlagworte:
Status des Themas:
Es sind keine weiteren Antworten möglich.
  1. 9. September 2008
    Bild-Resize in Konsolenanwendung?

    Ich würde gerne eine Konsolenanwendung schreiben, die mit übergegeben Parametern (bspw.: -x 800 -y 600) ein Bild auf ein Maximalgröße resized, ohne dabei die Seitenverhältnisse zu verlieren. Dazu habe ich auch schon einige Methoden, aber mir fehlt etwas anderes.

    Da ich recht neu in Sachen C# bin, würde ich gerne wissen, ob (und wenn ja: wie) es möglich ist, Bilder in einer Konsolenanwendung zu bearbeiten. Ich kenne zwar schon ein paar Sachen bezüglich GDI+, jedoch scheint mir dies lediglich bei WindowsForms-Anwendungen zu funktionieren.. oder irre ich mich?

    Wär schön, wenn jemand etwas Beispielcode hätte. Im Normalfall ist der Rest ja selbsterklärend, bzw. googlebar. Wie gesagt, das Problem mit den zu übergebenen Parametern und dem Seitenverhältnis habe ich in der Theorie schon gelöst.

    Ich danke schon einmal. Und natürlich gibt es auch eine Bewertung für jeden hilfreichen Beitrag!
     
  2. 9. September 2008
    AW: Bild-Resize in Konsolenanwendung?

    Du musst unter "References" im Projektmappenexplorer einen Verweis auf System.Drawing hinzufügen. Normalerweise geht das mit

    Code:
    using System.Drawing;
    aber das scheint in einer Konsolenanwendung nicht möglich zu sein.

    Wenn du das gemacht hast, hast du hier ein Beispiel, das eigentlich deinen Wünschen entsprechen sollte. Du musst es nur ein wenig umschreiben.

    Wichtig: du musst Grafikobjekte in diesem Fall immer mit System.Drawing.XXX erstellen. Beispiel:

    Code:
    Bitmap bTemp = new Bitmap(1, 1); // geht nicht
    System.Drawing.Bitmap bTemp = new System.Drawing.Bitmap(1, 1); // geht
     
  3. 9. September 2008
    AW: Bild-Resize in Konsolenanwendung?

    Das Beispiel hatte ich auch schon gefunden, aber danke dennoch.

    Ich wollte eben gerne eine Konsolenanwendung haben, da wir es mit einem ERP System aufrufen, welches eine Webshop Anbindung bietet. Diese Anwendung sollte dann die angefügten Bilder in 2 weitere, kleinere Thumbnails umwandeln.

    Wichtig wäre hierbei, dass das Programm nicht installiert werden muss und eben Parameter mit übergeben bekommt, damit unsere Kunden nicht mehr selbst starten und eingeben müssen, sondern nur eine Anzeige mit Fortschritt zu sehen bekommen.

    Bewertung bekommst du natürlich =) Ich dank dir auch nochmals!
     
  4. 9. September 2008
    AW: Bild-Resize in Konsolenanwendung?

    Wo ist dann das Problem? Die Funktion kannst du doch in einer Konsolenanwendung verwenden
     
  5. 9. September 2008
    AW: Bild-Resize in Konsolenanwendung?

    Nein, bisher noch nicht... ich habe lediglich einen theoretischen Code, der Bilder mit dem richtigen Seitenverhältnis beibehält, aber da fehlt noch das ganze drum-herum. Eben da weiß ich garnicht, ob das wirklich in einer Konsolenanwendung klappt.

    Habe bisher auch leider noch kein Tutorial dazu gefunden. Fast überall wird es mit WindowsForms realisiert :/
     
  6. 9. September 2008
    AW: Bild-Resize in Konsolenanwendung?

    Welches Drumherum? Du musst nur die per Befehlszeile übergebenen Parameter an die Funktion übergeben und das Bild speichern. Vielleicht noch den Pfad des Quellbildes an die Funktion übergeben und das war es. Wie du das ganze für eine Konsolenanwendung anpasst, hab ich zwei Posts weiter oben beschrieben :]
     
  7. 9. September 2008
    AW: Bild-Resize in Konsolenanwendung?

    Ah, hab deinen Post missinterpretiert ^^
    Okay, dann versuch ich mal mein Glück.. nur scheint er:

    System.Drawing.Bitmap bTemp = new System.Drawing.Bitmap(1, 1);

    nicht so gern zu haben, obwohl ich das Drawing als Verweis und als Using eingetragen habe.. :/
    Ich merk schon, ich sollte bei meinem Websprachen bleiben
     
  8. 9. September 2008
    AW: Bild-Resize in Konsolenanwendung?

    Was kommt denn für ein Fehler?

    Ich hab die Funktion GetThumbnailImage() gefunden und ein kleines Beispielprogramm geschrieben:

    Code:
    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace ConsoleApplication1
    {
     class Program
     { 
     private static string GetArg(string[] args, string sArgName)
     {
     for (int i = 0; i < args.Length; i++)
     {
     if (args[i] == "-" + sArgName && args.Length >= i)
     {
     return args[i + 1];
     }
     }
    
     return "";
     }
    
     static void Main(string[] args)
     {
     if (GetArg(args, "x") != "" && GetArg(args, "y") != "" && GetArg(args, "pic") != "" && GetArg(args, "dest") != "")
     {
     System.Drawing.Bitmap bmpTemp = new System.Drawing.Bitmap(GetArg(args, "pic"));
     System.Drawing.Image.GetThumbnailImageAbort myCallback = new System.Drawing.Image.GetThumbnailImageAbort(ThumbnailCallback);
     System.Drawing.Image imgTemp = bmpTemp.GetThumbnailImage(Convert.ToInt32(GetArg(args, "x")), Convert.ToInt32(GetArg(args, "y")), myCallback, IntPtr.Zero);
    
     imgTemp.Save(@GetArg(args, "dest"), bmpTemp.RawFormat);
    
     bmpTemp.Dispose();
     imgTemp.Dispose();
     }
     }
    
     private static bool ThumbnailCallback()
     {
     return false;
     }
     }
    }
    Beispielbefehlszeile:

    Code:
    -x 100 -y 100 -pic bild.bmp -dest bild2.bmp
    Erstellt ein Thumbnail (bild2.bmp) aus bild.bmp mit den Maßen 100x100.
     
  9. 9. September 2008
    AW: Bild-Resize in Konsolenanwendung?

    Hatte dir gerade noch eine PN geschrieben. Aber werde mich erstmal in deine Lösung vertiefen.
    Zudem gibbet gerade Mittagessen

    Danke dir aber nochmal. Endlich mal konkrete Lösungen, gute Ratschläge und nicht son unfreundliches Fachgesimpel
     
  10. 9. September 2008
    AW: Bild-Resize in Konsolenanwendung?

    Problem:

    Absturz sobald ich ich Parameter übergebe. Folgende Parameter übergebe ich:

    Code:
    -x 100 -y 100 -folder "C:\" -dest "C:\"
    Und so sieht mein Quellcode nun aus (vorläufig nur um Ordner nach *.jpg's zu durchsuchen und diese alle mit dem prefix "scaled_" umzuwandeln, in den mitgegebenen Zielordner):


    Code:
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.IO;
    
    namespace resizeit
    {
     class Program
     {
     private static string GetArg(string[] args, string sArgName)
     {
     for (int i = 0; i < args.Length; i++)
     {
     if (args[i] == "-" + sArgName && args.Length >= i)
     {
     return args[i + 1];
     }
     }
    
     return "";
     }
    
     static void Main(string[] args)
     {
     if (GetArg(args, "x") != "" && GetArg(args, "y") != "" && GetArg(args, "folder") != "" && GetArg(args, "dest") != "")
     {
     string[] folder_item = Directory.GetFiles(GetArg(args, "folder"), "*.jpg");
     foreach (string files in folder_item)
     {
     System.Drawing.Bitmap bmpTemp = new System.Drawing.Bitmap(files);
     System.Drawing.Image.GetThumbnailImageAbort myCallback = new System.Drawing.Image.GetThumbnailImageAbort(ThumbnailCallback);
     System.Drawing.Image imgTemp = bmpTemp.GetThumbnailImage(Convert.ToInt32(GetArg(args, "x")), Convert.ToInt32(GetArg(args, "y")), myCallback, IntPtr.Zero);
    
     imgTemp.Save(@GetArg(args, "scaled_" + files), bmpTemp.RawFormat);
    
     bmpTemp.Dispose();
     imgTemp.Dispose();
     }
     }
     }
    
     private static bool ThumbnailCallback()
     {
     return false;
     }
     }
    }
    
     
  11. 9. September 2008
    AW: Bild-Resize in Konsolenanwendung?

    welchen fehler...

    und probier mal C:\\ c# braucht immer 2 \
     
  12. 9. September 2008
    AW: Bild-Resize in Konsolenanwendung?

    Code:
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.IO;
    
    namespace resizeit
    {
     class Program
     {
     private static string GetArg(string[] args, string sArgName)
     {
     for (int i = 0; i < args.Length; i++)
     {
     if (args[i] == "-" + sArgName && args.Length >= i)
     {
     return args[i + 1];
     }
     }
    
     return "";
     }
    
     private static string RemoveExtension(string sFilename)
     {
     return sFilename.Substring(0, sFilename.IndexOf('.') - 1);
     }
    
     private static string GetExtension(string sFilename)
     {
     return sFilename.Substring(sFilename.IndexOf('.') + 1);
     }
    
     static void Main(string[] args)
     {
     if (GetArg(args, "x") != "" && GetArg(args, "y") != "" && GetArg(args, "folder") != "" && GetArg(args, "dest") != "")
     {
     string[] folder_item = Directory.GetFiles(GetArg(args, "folder"), "*.jpg");
     foreach (string files in folder_item)
     {
     System.Drawing.Bitmap bmpTemp = new System.Drawing.Bitmap(files);
     System.Drawing.Image.GetThumbnailImageAbort myCallback = new System.Drawing.Image.GetThumbnailImageAbort(ThumbnailCallback);
     System.Drawing.Image imgTemp = bmpTemp.GetThumbnailImage(Convert.ToInt32(GetArg(args, "x")), Convert.ToInt32(GetArg(args, "y")), myCallback, IntPtr.Zero);
    
     string sPath = RemoveExtension(files) + "_scaled." + GetExtension(files);
    
     imgTemp.Save(@sPath, bmpTemp.RawFormat);
    
     bmpTemp.Dispose();
     imgTemp.Dispose();
     }
     }
     }
    
     private static bool ThumbnailCallback()
     {
     return false;
     }
     }
    }
    Probiers mal so, du hattest einen Parameter falsch benannt und andere Kleinigkeiten.

    Befehlszeile:

    Code:
    -x 100 -y 100 -folder c:\ -dest c:\
    x: Breite
    y: Höhe
    folder: Stammverzeichnis
    dest: Zielverzeichnis
     
  13. 9. September 2008
    1) Ja das ist schon super. Nur das mit dem Zielverzeichnis macht er noch nicht, er schreibt es weiter ins Stammverzeichnis.

    2) Er kürzt komischerweise den letzten Buchstaben des neuen Bildes. Aus test_big.jpg wird test_bi_scaled.jpg - er hat also das "g" noch weggeschnitten. Aber wieso?

    //edit

    Ok, das mit dem Buchstaben zu viel der gekürzt wird hab ich wegbekommen. Bleibt nur noch das Zielverzeichnis..
     
  14. 9. September 2008
    AW: Bild-Resize in Konsolenanwendung?

    private static string RemoveExtension(string sFilename)
    {
    return sFilename.Substring(0, sFilename.IndexOf('.') - 1);
    }

    hier wird das der letzte buchstabe abgeschnitten einfach das -1 wegmachen und dann sollte es funktionieren

    edit: sry war wohl zu spät
     
  15. 9. September 2008
    AW: Bild-Resize in Konsolenanwendung?

    macht nix, aber dennoch danke. Bekommst auch ne BW
     
  16. 9. September 2008
    AW: Bild-Resize in Konsolenanwendung?

    string sPath = GetArg(args, "dest") + RemoveExtension(files) + "_scaled." + GetExtension(files);

    imgTemp.Save(@sPath, bmpTemp.RawFormat);

    das einfach so abändern sollte dann funktionieren.

    war bis jetzt beim abspeichern die destination noch nicht verwendet worden
     
  17. 9. September 2008
    AW: Bild-Resize in Konsolenanwendung?

    das gibt leider einen harten Absturz :/
    hatte ich nämlich auch schon probiert ^^
     
  18. 9. September 2008
    AW: Bild-Resize in Konsolenanwendung?

    Probiers mal so, kanns grade net testen:

    Code:
    string sPath = GetArg(args, "dest") + RemoveExtension(Path.GetFileName(files)) + "_scaled." + GetExtension(files);
     
  19. 9. September 2008
    AW: Bild-Resize in Konsolenanwendung?

    Super passt
    dann setz ich mich mal an die richtige skalierung, bzw. das einhalten der Seitenverhältnisse.

    Dafür hatte mir Gibbon ja auch schon einen super Link geschickt. Dank Euch allen nochmal!
     
  20. 9. September 2008
    AW: Bild-Resize in Konsolenanwendung?

    Mir fällt grade ein, dass da stand:

    Nur so zur Info.
     
  21. 9. September 2008
    AW: Bild-Resize in Konsolenanwendung?

    // edit
    scheint noch ein Fehler drin zu sein, bekomm noch nen Absturz..

    der Fehler scheint bei den Parametern zu liegen. Wie bekomme ich diese als richtigen int Wert?

    Code:
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.IO;
    
    namespace ResizeIt
    {
     class Program
     {
     // Methode um die Strings zu bauen / lesen zu können
     private static string GetArg(string[] args, string sArgName)
     {
     for (int i = 0; i < args.Length; i++)
     {
     if (args[i] == "-" + sArgName && args.Length >= i)
     {
     return args[i + 1];
     }
     }
    
     return "";
     }
    
     // Methode um Endung (.jpg) abzuschneiden
     private static string RemoveExtension(string sFilename)
     {
     return sFilename.Substring(0, sFilename.IndexOf('.'));
     }
    
     // Methode um nur die Endung (.jpg) zu bekommen
     private static string GetExtension(string sFilename)
     {
     return sFilename.Substring(sFilename.IndexOf('.') + 1);
     }
    
     // Hauptroutine
     static void Main(string[] args)
     {
     // Falls alle Parameter vollständig sind
     if (GetArg(args, "x") != "" && GetArg(args, "dir") != "" && GetArg(args, "dest") != "")
     {
     // Speicher alle (.jpg) Dateien aus dem Stammverzeichnis
     string[] folder_item = Directory.GetFiles(GetArg(args, "dir"), "*.jpg");
    
     // Versuch die Bilder neu zu skalieren
     try
     {
     // Durchlaufe solange (.jpg) Dateien vorhanden sind
     foreach (string files in folder_item)
     {
     // Lege neue Bitmap mit Drawzone an
     System.Drawing.Bitmap bmpTemp = new System.Drawing.Bitmap(files);
    
     int item_x = bmpTemp.Width;
     int item_y = bmpTemp.Height;
     int dimension = item_x / item_y;
    
     string new_item_x = GetArg(args, "x");
     int new_item_y = (Convert.ToInt32(new_item_x) / dimension);
    
     System.Drawing.Image.GetThumbnailImageAbort myCallback = new System.Drawing.Image.GetThumbnailImageAbort(ThumbnailCallback);
     System.Drawing.Image imgTemp = bmpTemp.GetThumbnailImage(Convert.ToInt32(GetArg(args, "x")), Convert.ToInt32(100), myCallback, IntPtr.Zero);
    
     // Zielpfad
     string sPath = GetArg(args, "dest") + RemoveExtension(Path.GetFileName(files)) + "_scaled." + GetExtension(files);
    
     // Speichern
     imgTemp.Save(@sPath, bmpTemp.RawFormat);
    
     // Temporäre Dateien entsorgen
     bmpTemp.Dispose();
     imgTemp.Dispose();
    
     // Ausgabe der bereits fertig skalierten Dateien
     Console.WriteLine(RemoveExtension(files) + " wurde neu skaliert...");
    
     }
     }
    
     // Falls Skalieren nicht erfolgreich war: Fehlermeldung
     catch
     {
     Console.WriteLine("Fehler: Bilder konnten nicht skaliert werden.");
     Console.Read();
     }
     }
     }
    
     private static bool ThumbnailCallback()
     {
     return false;
     }
     }
    }
    
     
  22. 9. September 2008
    Zuletzt von einem Moderator bearbeitet: 14. April 2017
    AW: Bild-Resize in Konsolenanwendung?

    hab dir hier ma hochgeladen

    No File | xup.in

    funktioniert bei mir alles wies soll
     
  23. 9. September 2008
    Mit welchen Parametern rufst du die denn auf?
    weil normalerweise verzichte ich ja nun auf das -y
    Code:
    -x 100 -dir stammverz. -dest zielverz.
    wenn ich das so benutze geht es nicht.. :/


    wie gesagt, denke da muss folgendes angepasst werden:
    Code:
    string new_item_x = GetArg(args, "x");
    int new_item_y = (Convert.ToInt32(new_item_x) / dimension);
    damit die Zeile keinen Fehler verursacht:
    Code:
    System.Drawing.Image imgTemp = bmpTemp.GetThumbnailImage(Convert.ToInt32(GetArg(args, "x")), Convert.ToInt32(new_item_y), myCallback, IntPtr.Zero);
    
    So geschafft... so ist es nun definitiv richtig

    Code:
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.IO;
    
    namespace ResizeIt
    {
     class Program
     {
     // Methode um die Strings zu bauen / lesen zu können
     private static string GetArg(string[] args, string sArgName)
     {
     for (int i = 0; i < args.Length; i++)
     {
     if (args[i] == "-" + sArgName && args.Length >= i)
     {
     return args[i + 1];
     }
     }
    
     return "";
     }
    
     // Methode um Endung (.jpg) abzuschneiden
     private static string RemoveExtension(string sFilename)
     {
     return sFilename.Substring(0, sFilename.IndexOf('.'));
     }
    
     // Methode um nur die Endung (.jpg) zu bekommen
     private static string GetExtension(string sFilename)
     {
     return sFilename.Substring(sFilename.IndexOf('.') + 1);
     }
    
     // Hauptroutine
     static void Main(string[] args)
     {
     // Falls alle Parameter vollständig sind
     if (GetArg(args, "x") != "" && GetArg(args, "dir") != "" && GetArg(args, "dest") != "")
     {
     // Speicher alle (.jpg) Dateien aus dem Stammverzeichnis
     string[] folder_item = Directory.GetFiles(GetArg(args, "dir"), "*.jpg");
    
     // Versuch die Bilder neu zu skalieren
     try
     {
     // Durchlaufe solange (.jpg) Dateien vorhanden sind
     foreach (string files in folder_item)
     {
     // Lege neue Bitmap mit Drawzone an
     System.Drawing.Bitmap bmpTemp = new System.Drawing.Bitmap(files);
    
     double item_x = bmpTemp.Width;
     double item_y = bmpTemp.Height;
     double dimension = (item_y / item_x);
    
     double new_item_x = Convert.ToDouble(GetArg(args, "x"));
     double new_item_y = (new_item_x * dimension);
     
     System.Drawing.Image.GetThumbnailImageAbort myCallback = new System.Drawing.Image.GetThumbnailImageAbort(ThumbnailCallback);
     System.Drawing.Image imgTemp = bmpTemp.GetThumbnailImage(Convert.ToInt32(GetArg(args, "x")), Convert.ToInt32(new_item_y), myCallback, IntPtr.Zero);
    
     // Zielpfad
     string sPath = GetArg(args, "dest") + RemoveExtension(Path.GetFileName(files)) + "_scaled." + GetExtension(files);
    
     // Speichern
     imgTemp.Save(@sPath, bmpTemp.RawFormat);
    
     // Temporäre Dateien entsorgen
     bmpTemp.Dispose();
     imgTemp.Dispose();
    
     // Ausgabe der bereits fertig skalierten Dateien
     Console.WriteLine(RemoveExtension(files) + " wurde neu skaliert...");
    
     }
     }
    
     // Falls Skalieren nicht erfolgreich war: Fehlermeldung
     catch
     {
     Console.WriteLine("Fehler: Bilder konnten nicht skaliert werden.");
     Console.Read();
     }
     }
     }
    
     private static bool ThumbnailCallback()
     {
     return false;
     }
     }
    }
    

    Ich danke allen Beteiligten für ihre Hilfe! Super von Euch =)
     
  24. 9. September 2008
    AW: Bild-Resize in Konsolenanwendung?

    [X] Erledigt.

    ~closed~

    Mfg,

    Kolazomai
     
  25. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.