Как сделать прозрачным PictureBox?

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 24.12.2007 (Пн) 20:32

Можно и ручками. Всё зависит от задачи, которую ты себе поставил и граблей, на которые ты успел налететь )
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

GeeZeR
Начинающий
Начинающий
 
Сообщения: 15
Зарегистрирован: 09.12.2007 (Вс) 7:30
Откуда: Киев

Сообщение GeeZeR » 25.12.2007 (Вт) 2:19

Nord777 привет! Тут нарисовалась небольшая проблемка:

Я создал прямоугольный рисунок Doorx2.png (одна дверь над другой):
Изображение

Загрузил его в PictureBox3 и применил твой код, изменив там PictureBox2 на PictureBox3, получилось вот что:

Изображение

В общем суть в том, что Door.png содержащийся в PictureBox2 это квадратный рисунок со сторонами 128х128, а Doorx2.png в PictureBox3 это прямоугольник! Короче функция считывает все прозрачные участки верно, но накладывает вот так косячно. В алгоритме где-то ошибка - при окончательной отрисовке в коде высота всегда получается равной ширине - поэтому на рисунке с глюком видно, что функция взяла своё с рисунка правильно, а наложила в соответствии с тем, что высота строго равна ширине, то есть не учла другой размер высоты в данном случае.
Прошу тебя если будет время сделать код универсальным и поясни где там отрисовывается высота обязательно равная ширине - я смотрел блин и нифига не впоймал этот момент.

Код: Выделить всё
Imports System.Drawing.Drawing2D
Imports System.Runtime.InteropServices

Public Class Form1
  <DllImport("kernel32.dll", EntryPoint:="RtlMoveMemory", CharSet:=CharSet.Auto, SetLastError:=True, ExactSpelling:=True)> _
   Public Shared Sub CopyMemory(ByVal DestData As Integer(,), ByVal SrcData As IntPtr, ByVal Size As Integer)
  End Sub

  Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim BMP As Bitmap = My.Resources.doorx2
        PictureBox3.Region = GetRegion(BMP)
  End Sub


  Function GetRegion(ByVal Bmp As Bitmap) As System.Drawing.Region
    Dim BmpArr(Bmp.Width - 1, Bmp.Height - 1) As Integer
    Dim BmpRect As Rectangle = Rectangle.Round(Bmp.GetBounds(GraphicsUnit.Pixel))
    Dim Reg As New Region(BmpRect)

    If Bmp.PixelFormat <> Imaging.PixelFormat.Format32bppArgb Then Return Reg

    Dim BData As Imaging.BitmapData
    BData = BMP.LockBits(BmpRect, Imaging.ImageLockMode.ReadOnly, BMP.PixelFormat)
    Dim Ptr As IntPtr = BData.Scan0
    Bmp.UnlockBits(BData)

    CopyMemory(BmpArr, Ptr, BmpArr.Length * 4)

    Dim Rect As New Rectangle(0, 0, 1, 1)
    Dim RowEnd = BmpArr.GetUpperBound(0)
    Dim ColEnd = BmpArr.GetUpperBound(1)

    For Row As Integer = 0 To RowEnd
      For Col As Integer = 0 To ColEnd
        If BmpArr(Row, Col) >> 24 = 0 Then
          Rect.X = Col : Rect.Y = Row
          Reg.Exclude(Rect)
        End If
      Next
    Next

    Return Reg
  End Function

End Class
Вложения
PictureBox_Doorx2.rar
(1.02 МиБ) Скачиваний: 181

GeeZeR
Начинающий
Начинающий
 
Сообщения: 15
Зарегистрирован: 09.12.2007 (Вс) 7:30
Откуда: Киев

Сообщение GeeZeR » 25.12.2007 (Вт) 2:57

программист писал(а):Суть моей идеи: считать в BackgroundImage Pic2 часть Pic1, которую заслоняет Pic2 !?
Это реально ??? И если реально то как ???

Да, я тебе даже алгоритм подарю вот:
- определяем размеры и местоположение Pic2
- формируем прямоугольник и делаем скриншот в него ыыы :)
- присваиваем скриншот бэк-картинке.

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 25.12.2007 (Вт) 18:13

В алгоритме где-то ошибка
В первой строке функции, там где обьявляется массив, поменяй местами ширину и высоту.
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

GeeZeR
Начинающий
Начинающий
 
Сообщения: 15
Зарегистрирован: 09.12.2007 (Вс) 7:30
Откуда: Киев

Сообщение GeeZeR » 25.12.2007 (Вт) 18:43

"Вы маг и чародей, профессор!" :wink:

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 25.12.2007 (Вт) 19:13

"Я не волшебник, я только учусь" )
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 28.12.2007 (Пт) 11:51

Public Sub MakeTransparent(ByVal transparentColor As System.Drawing.Color)
Member of System.Drawing.Bitmap
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

GeeZeR
Начинающий
Начинающий
 
Сообщения: 15
Зарегистрирован: 09.12.2007 (Вс) 7:30
Откуда: Киев

Сообщение GeeZeR » 28.12.2007 (Пт) 21:48

Sebas если можно - на нашем примере пожалуйста.

программист
Новичок
Новичок
Аватара пользователя
 
Сообщения: 42
Зарегистрирован: 19.07.2007 (Чт) 20:27
Откуда: Донецк

Сообщение программист » 09.01.2008 (Ср) 0:08

Sebas
а дальше???
Имя ничего не значит, НО ...
... я работаю над собой!

GeeZeR
Начинающий
Начинающий
 
Сообщения: 15
Зарегистрирован: 09.12.2007 (Вс) 7:30
Откуда: Киев

Сообщение GeeZeR » 09.01.2008 (Ср) 16:13

Народ, вот Mikle создал свою библиотеку для всего этого: http://bbs.vbstreets.ru/viewtopic.php?t=32517

Jure
Начинающий
Начинающий
 
Сообщения: 1
Зарегистрирован: 09.03.2008 (Вс) 12:44

Сообщение Jure » 09.03.2008 (Вс) 12:49

Попробуйте код (правда это C#, но на бейсике сами догадаетесь как сделать ;) ):
Код: Выделить всё
pictureBox1.Controls.Add(pictureBox2);
((Bitmap)(pictureBox2.Image)).MakeTransparent(Color.White);

Пред.

Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 3

    TopList  
cron