Поместите изображение в ограничительную рамку и залейте остальное черным в C # - PullRequest
0 голосов
/ 24 января 2012

У меня есть функция:

    private static Image ScaleAndPadBlack(Image original_img, Thumbnail thumb)
    {
        if (thumb.OptimalSizeHeight <= 0)
        {
            throw new ArgumentOutOfRangeException("OptimalSizeHeight", "OptimalSizeHeight must be declared and positive when using the ScaleAndCrop method.");
        }
        if (thumb.OptimalSizeWidth <= 0)
        {
            throw new ArgumentOutOfRangeException("OptimalSizeWidth", "OptimalSizeWidth must be declared and positive when using the ScaleAndCrop method.");
        }

        Size dest_size = new Size(thumb.OptimalSizeWidth, thumb.OptimalSizeHeight);

        decimal act_width_rate = (decimal)dest_size.Width / (decimal)original_img.Width;
        decimal act_height_rate = (decimal)dest_size.Height / (decimal)original_img.Height;

        decimal scale_rate;
        if (act_width_rate <= act_height_rate)
            scale_rate = act_width_rate;
        else
            scale_rate = act_height_rate;

        Size act_size = new Size(Convert.ToInt32(original_img.Width * scale_rate), Convert.ToInt32(original_img.Height * scale_rate));

        var res = resizeImage(original_img, act_size);

        var b = new Bitmap(thumb.OptimalSizeWidth, thumb.OptimalSizeHeight);
        var g = Graphics.FromImage(b);

        Point p = new Point(((dest_size.Width - act_size.Width) / 2), ((dest_size.Height - act_size.Height) / 2));
        g.FillRectangle(Brushes.Black, new Rectangle(new Point(0, 0), dest_size));
        g.SmoothingMode = SmoothingMode.None;
        g.InterpolationMode = InterpolationMode.NearestNeighbor;
        g.DrawImage(res, p);
        res.Dispose();
        res = null;
        return b;
    }

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

Проблема в том, что изменение размера полностью белого изображения jpg (761x896) в ограничивающем прямоугольнике 270x180 приводит к следующему:

Greyish bar on top

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

Почему это происходит? Изменение размера изображения может привести к прозрачным краям? Это определенно не желательно в этом случае.

Или это верхний край, потому что есть какая-то другая причина?

Как мне написать эту функцию, чтобы в таких случаях не было черно-серых ребер? Я хочу только заполнить ту часть, где нет изображения, я должен сделать что-то совершенно по-другому?

EDIT:

g.SmoothingMode = SmoothingMode.None; g.InterpolationMode = InterpolationMode.NearestNeighbor; там, потому что я тестировал эту проблему. Кажется, они не имеют значения.

1 Ответ

0 голосов
/ 24 января 2012

Я изменил часть прорисовки и заполнения прямоугольника на:

        g.DrawImage(res, p);            
        //left
        g.FillRectangle(Brushes.Black, new Rectangle(0, 0, p.X, dest_size.Height));
        //right
        g.FillRectangle(Brushes.Black, new Rectangle(p.X + act_size.Width, 0, p.X, dest_size.Height));
        //up
        g.FillRectangle(Brushes.Black, new Rectangle(0, 0, dest_size.Width, p.Y));
        //down
        g.FillRectangle(Brushes.Black, new Rectangle(0, p.Y + act_size.Width, dest_size.Width, p.Y));

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

...