Что вызывает OverflowException для TransformedBitmap.EndInit при попытке масштабирования растрового изображения в WPF? - PullRequest
2 голосов
/ 17 декабря 2010

У меня есть следующий код:

private void Process(string path)
    {
        using (FileStream fs = File.OpenRead(path))
        {
            JpegBitmapDecoder decoder = new JpegBitmapDecoder(fs,BitmapCreateOptions.PreservePixelFormat,BitmapCacheOption.Default);
            BitmapSource bmps = decoder.Frames.First();
            double targetScale = 800.0/600.0;
            double scaleX = bmps.PixelWidth*targetScale;
            double scaleY = bmps.PixelHeight*targetScale;
            TransformedBitmap tbmp = new TransformedBitmap();
            tbmp.BeginInit();
            tbmp.Source = bmps;
            tbmp.Transform = new ScaleTransform(scaleX, scaleY);
            tbmp.EndInit();
            JpegBitmapEncoder encoder = new JpegBitmapEncoder();
            encoder.Frames.Add(BitmapFrame.Create(tbmp));
            using (FileStream fs2 = File.OpenWrite(path+".jpg"))
            {
                Debug.WriteLine(path+".jpg");
                encoder.Save(fs2);
            }
        }
    }

Выдает OverflowException в tbmp.EndInit();

Есть идеи почему?

ОБНОВЛЕНИЕ : Стоит упомянуть, что этот метод вызывается через ParallelQuery.Это не зависит от чего-либо, что может быть в другом потоке.

Ответы [ 2 ]

2 голосов
/ 17 декабря 2010

Вы уже рассчитали требуемое масштабирование, 800/600.Не умножайте на размер изображения.Исправить:

  tbmp.Transform = new ScaleTransform(targetScale, targetScale);
1 голос
/ 17 декабря 2010

Я предполагаю, что это потому, что ваш масштаб огромен.Например, предположим, что исходное изображение имеет размер 1600x1200 ... затем вы масштабируете его с коэффициентом 2,133,33333x1600, что дает вам окончательный размер изображения 3,413,333 x 1,920,000 - что довольно большое изображение!

Iподозреваю, что вы хотели:

double scaleX = targetScale / bmps.PixelWidth;
double scaleY = targetScale / bmps.PixelHeight;

В конце концов, я предполагаю, что если исходное изображение больше, вы хотите растянуть на меньше , а не больше .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...