В чем причина уменьшения размера изображения при повороте с помощью Image.RotateFlip () в C#? - PullRequest
0 голосов
/ 24 апреля 2020

У меня есть приложение, показывающее загрузку картинок из системы. Для этого я должен вращаться при загрузке портретных изображений. Первоначально при повороте размер изображения увеличивался, а метаданные изображения терялись. Затем я передал формат изображения в качестве параметра при сохранении изображения.

 myImage.Save(<ImagePath>, <Image Format>);

Но теперь размер файла уменьшается почти на 50%.

        using (Image image = Image.FromFile(sourceFileName))
            {
                int oritentation = (int)image.GetPropertyItem(274).Value[0];
                RotateFlipType rotatedFlipAngle = RotateFlipType.RotateNoneFlipNone;
                switch (oritentation)
                {
                    case 3:
                        rotatedFlipAngle = RotateFlipType.Rotate180FlipNone;
                        break;
                    case 4:
                        rotatedFlipAngle = RotateFlipType.Rotate180FlipX;
                        break;
                    case 5:
                        rotatedFlipAngle = RotateFlipType.Rotate90FlipX;
                        break;
                    case 6:
                        rotatedFlipAngle = RotateFlipType.Rotate90FlipNone;
                        break;
                    case 7:
                        rotatedFlipAngle = RotateFlipType.Rotate270FlipX;
                        break;
                    case 8:
                        rotatedFlipAngle = RotateFlipType.Rotate270FlipNone;
                        break;
                }
                var rawFormat = image.RawFormat;
                if (_rotatedFlipAngle != RotateFlipType.RotateNoneFlipNone)
                {
                    image.RotateFlip(_rotatedFlipAngle);
                    image.Save(fileName), rawFormat);
                }
            }

В чем проблема уменьшения оригинальный размер изображения? Спасибо.

1 Ответ

1 голос
/ 24 апреля 2020

Это на самом деле не зависит от поворота вашего изображения. Снижение качества из-за повторного сохранения файла со сжатием.

Уровень сжатия можно настроить вручную следующим образом:

using (Image image = Image.FromFile(sourceFileName))
        {
            int oritentation = (int)image.GetPropertyItem(274).Value[0];
            RotateFlipType rotatedFlipAngle = RotateFlipType.RotateNoneFlipNone;
            switch (oritentation)
            {
                case 3:
                    rotatedFlipAngle = RotateFlipType.Rotate180FlipNone;
                    break;
                case 4:
                    rotatedFlipAngle = RotateFlipType.Rotate180FlipX;
                    break;
                case 5:
                    rotatedFlipAngle = RotateFlipType.Rotate90FlipX;
                    break;
                case 6:
                    rotatedFlipAngle = RotateFlipType.Rotate90FlipNone;
                    break;
                case 7:
                    rotatedFlipAngle = RotateFlipType.Rotate270FlipX;
                    break;
                case 8:
                    rotatedFlipAngle = RotateFlipType.Rotate270FlipNone;
                    break;
            }

            ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders(); 
            ImageCodecInfo ici = null; 

            foreach (ImageCodecInfo codec in codecs)
            { 
                if (codec.MimeType == "image/jpeg") 
                ici = codec; 
            } 

            EncoderParameters ep = new EncoderParameters(); 
            ep.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, (long)100)


            if (_rotatedFlipAngle != RotateFlipType.RotateNoneFlipNone)
            {
                image.RotateFlip(_rotatedFlipAngle);
                image.Save(fileName), ici, ep);
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...