Масштабирование изображения не работает, когда высота и ширина исходного изображения меньше, высота и ширина масштабирования - PullRequest
1 голос
/ 07 сентября 2010

У меня проблема при попытке масштабировать изображение. Проблема возникает, когда изображение, которое я пытаюсь масштабировать (оригинал), меньше, чем размер, который я пытаюсь увеличить.

Например, изображение шириной 850 пикселей и высотой 700 пикселей пытается масштабироваться до ширины и высоты до 950 пикселей. Кажется, что изображение правильно масштабировано, но на моем растровом изображении оно отображается неправильно. Код для масштабирования изображения будет следовать. Ширина, отправляемая в ScaleToFitInside - это ширина и высота, которые пытаются масштабировать до 950 пикселей в моем примере.

 public static Image ScaleToFitInside(Image image, int width, int height) {
                Image reszied = ScaleToFit(image, width, height);

            Bitmap bitmap = new Bitmap(width, height);
            using (Graphics g = Graphics.FromImage(bitmap)) {
                g.SmoothingMode = SmoothingMode.HighQuality;
                g.InterpolationMode = InterpolationMode.HighQualityBicubic;
                g.PixelOffsetMode = PixelOffsetMode.HighQuality;

                Rectangle rect = new Rectangle(0, 0, width, height);
                g.FillRectangle(Brushes.White, rect);

                int x = (int)(((float)width - (float)reszied.Width) / 2);
                int y = (int)(((float)height - (float)reszied.Height) / 2);
                Point p = new Point(x, y);
                g.DrawImageUnscaled(reszied, p);

                foreach (PropertyItem item in image.PropertyItems) {
                    bitmap.SetPropertyItem(item);
                }
            }

            return bitmap;
        }

            public static Image ScaleToFit(Image image, int maxWidth, int maxHeight) {
            int width = image.Width;
            int height = image.Height;
            float scale = Math.Min(
                ((float)maxWidth / (float)width),
                ((float)maxHeight / (float)height));

            return (scale < 1) ? Resize(image, (int)(width * scale), (int)(height * scale)) : image;
        }

public static Image Resize(Image image, int width, int height) {
            Bitmap bitmap = new Bitmap(width, height);
            using (Graphics g = Graphics.FromImage(bitmap)) {
                g.SmoothingMode = SmoothingMode.HighQuality;
                g.InterpolationMode = InterpolationMode.HighQualityBicubic;
                g.PixelOffsetMode = PixelOffsetMode.HighQuality;

                Rectangle rect = new Rectangle(0, 0, width, height);
                g.DrawImage(image, rect, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel);

                foreach (PropertyItem item in image.PropertyItems) {
                    bitmap.SetPropertyItem(item);
                }
            }
            return bitmap;
        }

Таким образом, изображение масштабируется, но неправильно отображается на моем растровом изображении, из-за чего изображение «выпадает» из моего растрового изображения и не представляет себя полностью.

Пример: при отправке значений 2000x2000 (попытка увеличения). Происходит следующее.

Так как исходное изображение меньше, чем значения увеличения, я не хочу «обрезать его», но сохранить тот же размер. Эффект, который я хочу - нарисовать прямоугольник размером 2000x2000 и нарисовать изображение в центре.

Мой пример изображения дает следующие значения:

ширина = 2000; высота = 2000; resized.Width будет 1000 и resized.Hight будет 737 (оригинальный размер изображения).

х = (2000-1000) / 2 = 500; у = (2000 - 737) / 2 = 631.

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

Заранее спасибо.

1 Ответ

1 голос
/ 07 сентября 2010

Вы понимаете, что следующие 2 переменные будут отрицательными, когда вы увеличите размер?

int x = (int)(((float)width - (float)reszied.Width) / 2);
int y = (int)(((float)height - (float)reszied.Height) / 2);
...