11
votes

L'image redimensionnement avec GDI dans .NET donne une faible saturation

Je suis en train de combattre un problème dans lequel mes images redimensionnées perd la saturation des couleurs lorsque je les manipule à l'aide de GDI.

Je charge un JPG comme original, redimensionnez-le et l'image résultante a beaucoup moins de saturation (intensité de couleur) que la photo d'origine. Que puis-je faire pour améliorer cela? Ceci est mon code: P>


using ( var original = System.Drawing.Image.FromStream( new MemoryStream( image.RawData ) ) )
{
    using ( var dst = new Bitmap( width, height, PixelFormat.Format32bppArgb ) )
    {
        using ( var g = Graphics.FromImage( dst ) )
        {
            g.SmoothingMode = SmoothingMode.HighQuality;
            g.PixelOffsetMode = PixelOffsetMode.HighQuality;
            g.CompositingQuality = CompositingQuality.HighQuality;

            g.DrawImage( original, 0, 0, dst.Width, dst.Height );
            g.InterpolationMode = InterpolationMode.HighQualityBicubic;
            g.DrawImage( original, 0, 0, dst.Width, dst.Height );

            var jpgEncoder = GetEncoder( ImageFormat.Jpeg );
            var myEncoderParameters = new EncoderParameters( 1 );
            var quality = 95;
            var myEncoderParameter = new EncoderParameter( Encoder.Quality, quality );
            myEncoderParameters.Param[0] = myEncoderParameter;

            dst.Save( buffer, jpgEncoder, myEncoderParameters );
        }
    }
}


2 commentaires

image.rawdata d'où vient ça?


@Andre: C'est juste le tableau d'octet initial qui contient l'image. Dans mon cas, il a été chargé d'une base de données, mais cela pourrait être chargé de n'importe où. Image.fromstream prend un flux, il peut donc s'agir d'un flux de réseau ou autre. J'ai eu un tableau d'octets, alors je l'ai enveloppé dans une mémoire Mémoire.


4 Réponses :


-1
votes

Été là, fait ça. Idiot alors qu'il peut sembler, cette différence: xxx

ou xxx

ou xxx

en choisir un.


1 commentaires

Je n'ai pas de problème avec la qualité de la compression, juste la saturation des couleurs. J'ai essayé votre suggestion mais malheureusement, cela n'a pas fait de différence ...



0
votes

J'ai un code d'image-sauvage que j'utilise, et je ne vois pas l'effet que vous mentionnez.

La principale différence que je vois est que j'utilise format24bppprgb et non au format24bpp A rgb

Gardez à l'esprit que JPG n'a aucun canal alpha de toute autre voie (AFAIK)


0 commentaires

0
votes

venant à ce sujet d'un autre angle, je recommanderais vivement Imageresizer si vous voulez prendre la douleur de faire de la douleur cela vous-même. Il prend même soin de la mise en cache de disque.


0 commentaires

21
votes

J'ai trouvé la réponse moi-même. Cela concerne les profils de couleurs qui ne sont pas appliqués par défaut dans GDI +. Beaucoup de gens affirment que vous ne pouvez pas appliquer automatiquement les profils de couleur à l'aide de GDI, mais apparemment, le seul changement que je devais faire était ceci:

à l'aide de (variginal = system.drawing.drawing.image.fromstream (Nouveau Morthstream (image.rawdata)))

à

en utilisant (var original = nouveau bitmap (Nouveau MemoryStream (image.rawdata), true))

Apparemment, Bitmap était une classe d'image dérivée et le constructeur de bitmap peut prendre à la fois un ruisseau ASWELL comme un booléen pour "utilité". Cela a fait le tour pour moi.


3 commentaires

Merci beaucoup d'avoir expliqué cela! Je suis au fond de la lecture sur le sous-échantillonnage de Chroma et d'autres problèmes possibles causant la perte de couleurs. Après avoir défini le drapeau USELCM True Mes photos JPEG sont parfaites en couleur.


J'ai le même problème, mais ce qui précède n'a fait aucune différence .:(


Peut-être que vos images n'ont pas d'informations de correction de couleur intégrées? Avez-vous essayé avec différentes images?