Удалить контур из изображения в прозрачной форме

#c# #image #visual-studio #winforms

Вопрос:

Я пытаюсь перевести форму окна в прозрачный вид и сделать так, чтобы в нем отображался только объект. Но у него все еще есть линия (обводка) вокруг моего объекта, он не совсем идеален, как я хотел. Как я могу удалить линию (обводку)? (Прилагаю картинку для сравнения.)

введите описание изображения здесь

Вот мой код:

 private void Form1_Load(object sender, EventArgs e)
{
    this.FormBorderStyle = FormBorderStyle.None;
    this.Width = this.pictureBox1.Width;
    this.Height = this.pictureBox1.Height;
    SetStyle(ControlStyles.SupportsTransparentBackColor, true);
    this.BackColor = Color.Black;
    this.TransparencyKey = this.pictureBox1.BackColor;
}
 

Комментарии:

1. Уверен, что это больше связано с изображением, чем с кодом, само изображение имеет контур

2. Можете ли вы опубликовать подробную информацию о формате изображения? Таким образом, мы можем знать, поддерживает ли он альфа-канал, что было бы наиболее вероятной причиной вашей проблемы с краем этого изображения без надлежащего альфа-канала, как в файле png. Сглаживание никогда не будет отображаться должным образом. Сглаживание — это то, что вам нужно для смешивания изогнутых краев с фоном. в случае прозрачного фона вам нужна альфа, чтобы иметь полупрозрачную непрозрачность по краю, чтобы добиться этого, просто потому, что вы не можете знать, каким будет фон.

3. Да, файл формата .png. и я взял его из Интернета. pngmart.com/image/16212

4. Скорее всего, граничные пиксели полупрозрачны. TransparencyKey не будет поддерживать это. Вам нужно удалить их или заполнить их до альфа = 255. Если вам нужна процедура для этого, так и скажите..

Ответ №1:

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

Вот функция, которая устраняет все полупрозрачные пиксели, делая их полностью прозрачными:

 using System.Runtime.InteropServices;
..

public static void UnSemi(Bitmap bmp)
{
    Size s = bmp.Size;
    PixelFormat fmt = bmp.PixelFormat;
    Rectangle rect = new Rectangle(Point.Empty, s);
    BitmapData bmpData = bmp.LockBits(rect, ImageLockMode.ReadOnly, fmt);
    int size1 = bmpData.Stride * bmpData.Height;
    byte[] data = new byte[size1];
    System.Runtime.InteropServices.Marshal.Copy(bmpData.Scan0, data, 0, size1);
    for (int y = 0; y < s.Height; y  )
    {
        for (int x = 0; x < s.Width; x  )
        {
            int index = y * bmpData.Stride   x * 4;
             // alpha,  threshold = 255
            data[index   3] = (data[index   3] < 255) ? (byte)0 : (byte)255; 
        }
    }
    System.Runtime.InteropServices.Marshal.Copy(data, 0, bmpData.Scan0, data.Length);
    bmp.UnlockBits(bmpData);
}
 

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

Также обратите внимание, что процедура принимает 32-битный пиксельный формат ARGB, как PNGs обычно.

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

Также: вы хотите установить pictureBox1.BackColor = Color.Transparent ..

Наконец: иногда имеет смысл добавить threshold параметр в сигнатуру функции, чтобы установить уровень, с которого можно включить или выключить альфа-все..

Вот пример использования:

 this.BackColor = Color.FromArgb(1,2,3,4);
this.TransparencyKey = this.BackColor;
UnSemi((Bitmap)this.pictureBox1.Image);
 

введите описание изображения здесь

Комментарии:

1. Все еще не могу. Я пробовал даже круглую форму с прозрачным покрытием, и ничего не изменилось. 🙁

2. Если вы не возражаете, вы можете быстро создать его на c #, а затем отправить мне этот файл? Так что я могу это видеть. Спасибо.

3. Я действительно попробовал это сделать. Хотя на самом деле он не так совершенен, как мне бы хотелось, но этот код очень полезен. Спасибо за вашу помощь. Ты потрясающая! : D

Ответ №2:

Используйте изображение в формате png с прозрачным фоном
, установите цвет фона элемента управления / формы и прозрачный ключ на цвет, которого нет на изображении

Комментарии:

1. Я так и сделал, но это та же проблема. Ничего не изменилось.