Bmp do jpg / png W C#

Czy Jest jakiś sposób na konwersję obrazu bmp na jpg / png bez utraty jakości w C#? Za pomocą klasy Image możemy przekonwertować bmp na jpg, ale jakość obrazu wyjściowego jest bardzo słaba. Czy możemy uzyskać poziom jakości tak dobry, jak obraz przekonwertowany do jpg za pomocą Photoshopa o najwyższej jakości?

Author: Ramesh Soni, 2008-09-03

8 answers

var qualityEncoder = Encoder.Quality;
var quality = (long)<desired quality>;
var ratio = new EncoderParameter(qualityEncoder, quality );
var codecParams = new EncoderParameters(1);
codecParams.Param[0] = ratio;
var jpegCodecInfo = <one of the codec infos from ImageCodecInfo.GetImageEncoders() with mime type = "image/jpeg">;
bmp.Save(fileName, jpegCodecInfo, codecParams); // Save to JPG
 52
Author: aku,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-03 13:39:51
public static class BitmapExtensions
{
    public static void SaveJPG100(this Bitmap bmp, string filename)
    {            
        EncoderParameters encoderParameters = new EncoderParameters(1);
        encoderParameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 100L);
        bmp.Save(filename, GetEncoder(ImageFormat.Jpeg), encoderParameters);
    }

    public static void SaveJPG100(this Bitmap bmp, Stream stream)
    {
        EncoderParameters encoderParameters = new EncoderParameters(1);
        encoderParameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 100L);
        bmp.Save(stream, GetEncoder(ImageFormat.Jpeg), encoderParameters);
    }

    public static ImageCodecInfo GetEncoder(ImageFormat format)
    {
        ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders();

        foreach (ImageCodecInfo codec in codecs)
        {
            if (codec.FormatID == format.Guid)
            {
                return codec;
            }
        }

        return null;
    }
}
 30
Author: jestro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-22 12:38:33

Pod warunkiem, że BitmapExtensions jestro są świetne, użyłem ich. Jednak chciałbym pokazać poprawioną wersję-działa dla klasy rodzica obrazu, która jest wygodniejsza, jak myślę i zapewnia sposób dostarczania jakości: {]}

public static class ImageExtensions
{
    public static void SaveJpeg(this Image img, string filePath, long quality)
    {
        var encoderParameters = new EncoderParameters(1);
        encoderParameters.Param[0] = new EncoderParameter(Encoder.Quality, quality);
        img.Save(filePath, GetEncoder(ImageFormat.Jpeg), encoderParameters);
    }

    public static void SaveJpeg(this Image img, Stream stream, long quality)
    {
        var encoderParameters = new EncoderParameters(1);
        encoderParameters.Param[0] = new EncoderParameter(Encoder.Quality, quality);
        img.Save(stream, GetEncoder(ImageFormat.Jpeg), encoderParameters);
    }

    static ImageCodecInfo GetEncoder(ImageFormat format)
    {
        ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders();
        return codecs.Single(codec => codec.FormatID == format.Guid);
    }
}
 10
Author: net_prog,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-02 18:54:40

To wygląda na to, że ma jakiś kod źródłowy, który może Ci pomóc... Podejrzewam, że po prostu brakowało parametru kodera jakości shrug >

 3
Author: Kevin Fairchild,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-18 22:03:06

Zasadniczo nie będziesz w stanie utrzymać tej samej jakości, ponieważ jpg jest (o ile mi wiadomo) zawsze stratny, nawet przy najwyższych możliwych ustawieniach jakości.

Jeśli jakość dokładności bitów jest naprawdę ważna, rozważ użycie png, który ma kilka trybów, które są bezstratne.

 1
Author: James Ogden,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-03 13:36:10

Chcę tylko powiedzieć, że JPEG jest z natury stratnym formatem. Więc w thoery nawet przy najwyższych ustawieniach będziesz miał pewną utratę informacji, ale to zależy w dużej mierze od obrazu.Ale png jest bezstratny.

 1
Author: paan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-04 06:52:44

Możesz spróbować:

Bitmap.InterpolationMode = InterpolationMode.HighQualityBicubic;

I

Bitmap.CompositingQuality = CompositingQuality.HighQuality;

Który utrzymuje jakość dość wysoką, ale nie NAJWYŻSZĄ możliwą.

 0
Author: GateKiller,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-03 13:33:47

Pracuję nad aplikacją do raportowania wydatków i jestem bardzo zadowolony z domyślnych ustawień jakości JPG (i PNG) podczas zapisywania z obiektu bitmapowego.

Https://msdn.microsoft.com/en-us/library/9t4syfhh%28v=vs.110%29.aspx

Bitmap finalBitmap = ....; //from disk or whatever
finalBitmap.Save(xpsFileName + ".final.jpg", ImageFormat.Jpeg);
finalBitmap.Save(xpsFileName + ".final.png", ImageFormat.Png);
Jestem na. Net 4.6...być może jakość poprawiła się w kolejnych wydaniach frameworków.
 0
Author: Jeff R LangBoost,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-23 11:29:40