En utilisant jpegtran, jpegoptim ou autre optimisation jpeg / compression en C #

voix
4

J'ai 100 de (peut-être 1000 de) produits avec 10-30 images de chaque produit à venir à un magasin en ligne, je l'ai mis en place. Je dois optimiser les tailles de fichier des images autant que possible sans perte de qualité d'image.

Je ne l'ai pas utilisé jpegtran, jpegoptim, ou tout autre optimiseur jpeg directement, mais je l'ai remarqué que punypng réduit la taille des fichiers en baisse d'environ 4-6% sur les images jpeg plus grands sans perte.

Les métadonnées sont déjà supprimées des images pendant le téléchargement (via jumpoader) de sorte que n'est pas une option / problème plus.

Est-il possible d'obtenir un des jpeg optimiseurs pour exécuter du code C #?

Note: J'utilise GoDaddy hébergement mutualisé avec IIS7 et .Net 3.5

Créé 29/09/2009 à 17:09
source utilisateur
Dans d'autres langues...                            


5 réponses

voix
3

Il pourrait être 7 ans trop tard, mais je suis tombé sur cette question, tout en essayant de résoudre ce problème. J'ai finalement réussi à le faire et c'est la solution. Pour PNG vous devez d'abord installer nQuant en utilisant NuGet.

comprendre:

using System.Web.Hosting;
using System.IO;
using System.Diagnostics;
using nQuant;
using System.Drawing;
using System.Drawing.Imaging;

méthodes:

    public void optimizeImages()
    {
        string folder = 
            Path.Combine(HostingEnvironment.ApplicationPhysicalPath, @"assets\temp");
        var files = Directory.EnumerateFiles(folder);

        foreach (var file in files)
        {
            switch (Path.GetExtension(file).ToLower())
            {
                case ".jpg":
                case ".jpeg":
                    optimizeJPEG(file);
                    break;
                case ".png":
                    optimizePNG(file);
                    break;
            }

        }

    }

    private void optimizeJPEG(string file)
    {
        string pathToExe = HostingEnvironment.MapPath("~\\adminassets\\exe\\") + "jpegtran.exe";

        var proc = new Process
        {
            StartInfo =
            {
                Arguments = "-optimize \"" + file + "\" \"" + file + "\"",
                FileName = pathToExe,
                UseShellExecute = false,
                CreateNoWindow = false,
                WindowStyle = ProcessWindowStyle.Hidden,
                RedirectStandardError = true,
                RedirectStandardOutput = true
            }
        };

        Process jpegTranProcess = proc;

        jpegTranProcess.Start();
        jpegTranProcess.WaitForExit();
    }

    private void optimizePNG(string file)
    {
        string tempFile = Path.GetDirectoryName(file) + @"\temp-" + Path.GetFileName(file);
        int alphaTransparency = 10;
        int alphaFader = 70;
        var quantizer = new WuQuantizer();
        using (var bitmap = new Bitmap(file))
        {
            using (var quantized = quantizer.QuantizeImage(bitmap, alphaTransparency, alphaFader))
            {
                quantized.Save(tempFile, ImageFormat.Png);

            }

        }
        System.IO.File.Delete(file);
        System.IO.File.Move(tempFile, file);
    }

Il faudra tous les fichiers / assets / dossier temp et optimiser les fichiers JPEG et PNG. Je suivais cette question pour la partie .png. La partie jpeg je raclée de plusieurs sources. Y compris PicJam et Image Optimizer . La façon dont je l' utilise est en téléchargeant tous les fichiers de l'utilisateur dans le dossier temp, l' exécution de cette méthode, télécharger les fichiers de stockage de blob bleu azur, et la suppression des fichiers locaux. Je jpegtran téléchargé ici .

Créé 19/07/2016 à 01:04
source utilisateur

voix
2

Si vous ne voulez pas gâcher avec des fichiers temporaires, je vous conseille d'utiliser C ++ / CLI.

Créer un projet dll C ++ / CLI en studio visuel. Créer une classe statique gérée, et définir les fonctions que vous voulez les utiliser à partir de C #:

public ref class JpegTools
{
public:
     static array<byte>^ Optimize(array<byte>^ input)
};

Ces fonctions peuvent être définis appelés directement à partir de C #, et vous pouvez les mettre en œuvre avec tout ce que C ++ offres.

^ réseau correspond à une matrice C # octet. Vous aurez besoin d'utiliser pin_ptr <> pour épingler le tableau d'octets dans la mémoire, de sorte que vous pouvez transmettre les données à la fonction d'aide Jpeg non géré de votre choix. C ++ / CLI a un support suffisant pour rassembler les types gérés à des types natifs. Vous pouvez également affecter nouveau tableau avec gc_new, pour revenir types compatibles CLI. Si vous devez marshall cordes de C # à C ++ dans le cadre de cette excercise, utilisez le type CString de la SFM / Atl.

Vous pouvez lier statiquement tout le code jpeg dans la dll. Un C ++ dll peut être mélangé natif pur et le code C ++ / CLI. Dans nos projets C ++ / CLI, généralement uniquement les fichiers source d'interface connaissent les types CLI, tout le travail de repos avec des types C ++.

Il y a quelques travaux généraux pour y aller de cette façon, mais la hausse est que votre code est la compilation TypeChecked, et toutes les transactions avec le code unmanged et de la mémoire sont traitées sur le côté C. Il fonctionne en fait si bien que je C ++ / CLI natif test unitaire code C ++ presque directement avec NUnit.

Bonne chance!

Créé 12/10/2009 à 19:35
source utilisateur

voix
1

Je suis sûr que je suis tout à fait tard pour répondre à cette question, mais récemment , j'ai dû faire face à problème sans perte d'optimisation jpeg et n'ont pas trouvé de mise en œuvre appropriée C # d'utilité jpegtran. Je l' ai ainsi décidé de mettre en œuvre par moi - même des routines pour la taille jpeg sans perte réducteur à base de wrapper C de jpegtran modifiée, que vous pouvez trouver ici . Il vient, cette prise de conscience similaire avec l' utilisation de pur .Net LibJpeg.NET est beaucoup plus lent que la solution C enveloppé, donc, je ne l' ai pas inclus à la prise en pension. L' utilisation d'emballage est assez simple,

if (JpegTools.Transform(jpeg, out byte[] optimized, copy: false, optimize: true))
{
  //do smth useful 
}
else
{
  //report on error or use original jpeg
}

L'espoir, quelqu'un trouvera utile.

Créé 06/04/2017 à 19:46
source utilisateur

voix
1

Je voudrais processus de traitement par lots les images avant de les télécharger sur votre serveur Web, plutôt essayer ensuite de les traiter tout en les servir. Cela conduira à moins de charge sur le serveur Web et laissez-vous utiliser tous les outils de traitement d'image de match que vous souhaitez.

Créé 12/10/2009 à 12:33
source utilisateur

voix
-1

Pourquoi ne pas appeler punypng.com avec Process.Start () ? Il n'y a aucune raison pour laquelle vous .net code ne peut pas exécuter des programmes externes, à condition que le traitement est effectué au moment de l' ajout (plutôt que les images au moment de servir)

Par exemple

  • télécharger dans un dossier « upload »,
  • ont un service de fenêtres que les montres pour les nouveaux fichiers dans le dossier « upload »
  • quand vous obtenez un nouveau fichier, commencez punypng.com pour traiter et mettre la sortie dans le dossier d'image correcte.
Créé 12/10/2009 à 14:47
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more