MagickImage создает мягкий край, который входит в 100% прозрачный - PullRequest
3 голосов
/ 20 марта 2020

Моя цель - создать мягкую рамку на любом изображении с краями go в 100% прозрачном цвете (вы не должны видеть края изображения )

Вот оригинальное изображение:

enter image description here

Я нашел это (http://www.imagemagick.org/Usage/thumbnails/#rounded):

enter image description here

convert thumbnail.gif -alpha set -virtual-pixel transparent \
          -channel A -blur 0x8  -level 50%,100% +channel  soft_edge.png

Из чего я тогда сделал это:

var mImage = new MagickImage(image);
mImage.Format = MagickFormat.Png;
mImage.Alpha(AlphaOption.Set);
mImage.VirtualPixelMethod = VirtualPixelMethod.Transparent;

var form = mImage.Clone();
form.Level(new Percentage(50), new Percentage(100),Channels.Alpha);
form.Blur(100, 50,Channels.Alpha);
mImage.Composite(form);
mImage.Write(image);

И результат этого таков:

enter image description here

Однако вы все еще можете четко видеть края, поэтому они недостаточно прозрачны.

Когда я беру изображение в Paint. NET Я вижу, что края действительно несколько прозрачны, но, вероятно, края прозрачны только на 50%, а не на 100%.

enter image description here

Я пытался отрегулировать проценты уровня, размытие и т. Д. И т. П., Но я не могу заставить края размыться правильно.

Как сделать края прозрачными на 100%, чтобы края изображения становились невидимыми при использовании изображения в Интернете?

Ответы [ 2 ]

2 голосов
/ 24 марта 2020

Пример почти правильный. Работает, когда действие Composite удалено. Пример командной строки переводится так:

using (var image = new MagickImage("thumbnail.gif"))
{
    // -alpha set
    image.Alpha(AlphaOption.Set);

    // -virtual-pixel transparent
    image.VirtualPixelMethod = VirtualPixelMethod.Transparent;

    // -channel A means that the next operations should only change the alpha channel

    // - blur 0x8
    image.Blur(0, 8, Channels.Alpha);

    // -level 50%,100%
    image.Level(new Percentage(50), new Percentage(100), Channels.Alpha);

    // +channel cancels only allow operations on the alpha channel.

    image.Write("soft_edge.png");
}
2 голосов
/ 23 марта 2020

Попробуйте это:

convert input.png -bordercolor black -fill white \
   \( -clone 0 -colorize 100 -shave 10x10 -border 10x10 -blur 0x10 \) \
   -compose copyopacity -composite output.png

C#

using (MagickImage mImage = new MagickImage(image))
{
    mImage.Format = MagickFormat.Png;

    using (IMagickImage mask = mImage.Clone())
    {
        mask.Format = MagickFormat.Png;

        mask.BorderColor = MagickColors.Black;
        mask.Colorize(MagickColors.White, new Percentage(100));
        mask.Shave(50, 50);
        mask.Border(50, 50);
        mask.Blur(0, 10);
        mImage.Composite(mask, CompositeOperator.CopyAlpha);

        mImage.Write(image);
        image.Position = 0;
    }
}

Редактировать:

Я постараюсь поместить код в более похожую на сценарий фантазию, поэтому что это легко для меня. Извините, если это не элегантно:

var image = new MagickImage("input.jpg");
var mask = image.Clone();
mask.BorderColor = MagickColors.Black;
mask.Colorize(MagickColors.White, new Percentage(100));
mask.Shave(10,10);
mask.Border(10,10);
mask.Blur(0,10);
image.Composite(mask, CompositeOperator.CopyAlpha);
image.Format = MagickFormat.Png;
image.Write("output.png");

...