Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > сохранить в jpeg без потери качества


Автор: cromm3 22.7.2008, 21:01
Всем привет!)) примерно так работаю с рисунками:
Код

System.Drawing.Bitmap image = new Bitmap(Server.MapPath("sce.jpg"));
        image.RotateFlip(RotateFlipType.Rotate90FlipNone);
        Graphics g = Graphics.FromImage(image);
        MemoryStream ms = new MemoryStream();
        FileStream fs = File.OpenWrite(Server.MapPath("sce.jpg"));
        ms.WriteTo(fs);
        fs.Flush();
        fs.Close();
        image.Save(ms, ImageFormat.Jpeg);
        g.Dispose();
        image.Dispose();

как можно сохранять в jpeg без потери качества?

спасибо!))

Автор: _hunter 23.7.2008, 11:23
jpeg'ов без потери качества небывает.
есть, вроде, jpeg2000, но это уже совсем другая история (не факт что они выпускают .NET кодеры)

Автор: Rififi 23.7.2008, 12:18
image.RotateFlip(RotateFlipType.Rotate90FlipNone);
нужен именно "настоящий" поворот, exif-тэг orientation не катит?
я вроде слышал какие-то слухи о возможности lossless-поворота на углы, кратные 90, но подробностями не интересовался.

Автор: cromm3 23.7.2008, 15:17
значит проблема почти не решается, на данный момент...
все равно спасибо))

Автор: Ctrl 23.7.2008, 20:53
Вот пример, который возможно поможет...
Идея в том что контролировать уровень качества при сохранении  в Jpeg
все-таки можно (дефолтный уровень соответствует 75%)

Код

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;

namespace SimpleJpegConverterTest {
    class Program {
        static void Main(string[] args) {
            using(Bitmap image = new Bitmap(@"d:\source.bmp")) {
                JpegImageHelper.SaveImageToFile(image, @"d:\target-25.jpg", 0.25f);  //Quality Level 25%
                JpegImageHelper.SaveImageToFile(image, @"d:\target-50.jpg", 0.5f);   //Quality Level 50%
                JpegImageHelper.SaveImageToFile(image, @"d:\target-75.jpg", 0.75f);  //Quality Level 75%
                JpegImageHelper.SaveImageToFile(image, @"d:\target-100.jpg", 1.00f); //Quality Level 100%
            }
        }
        public class JpegImageHelper {
            static ImageCodecInfo imageCodecInfo;
            static JpegImageHelper() {
                imageCodecInfo = GetEncoderInfo("image/jpeg");
            }
            public static void SaveImageToStream(Image image, Stream stream, float qualityFactor) {
                EncoderParameters codecParams = CreateEncoderParameter_Quality(qualityFactor);
                image.Save(stream, imageCodecInfo, codecParams);
            }
            public static void SaveImageToFile(Image image, string path, float qualityFactor) {
                EncoderParameters codecParams = CreateEncoderParameter_Quality(qualityFactor);
                image.Save(path, imageCodecInfo, codecParams);
            }
            static EncoderParameters CreateEncoderParameter_Quality(float qualityFactor) {
                EncoderParameters codecParams = new EncoderParameters(1);
                long qualityValue = Math.Min((long)(100f * qualityFactor), 100L);
                codecParams.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, qualityValue);
                return codecParams;
            }
            static ImageCodecInfo GetEncoderInfo(String mimeType) {
                ImageCodecInfo[] encoders = ImageCodecInfo.GetImageEncoders();
                for(int i = 0; i < encoders.Length; i++) {
                    if(encoders[i].MimeType == mimeType) return encoders[i];
                }
                return null;
            }
        }
    }
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)