Проблема с картинками

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Gfif21
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 71
Зарегистрирован: 31.05.2004 (Пн) 7:23

Проблема с картинками

Сообщение Gfif21 » 13.12.2004 (Пн) 15:48

Вот возникла проблема: я сделал програмку, в которой присутствует графика (в несколько Имеджей загружаются картинки с диска, картинки в формате gif). В Win XP все нормально работало. А посмотрел сегодня в Win Me и все Имиджи оказались пустыми. В чем может быть проблема (только ли этот глюк из-за другой системы)?

xolod
Гуру
Гуру
 
Сообщения: 1162
Зарегистрирован: 15.01.2004 (Чт) 0:42
Откуда: Moscow

Сообщение xolod » 13.12.2004 (Пн) 16:12

Уж сколько раз говорили, телепаты бросили нас еще на момент зарождения сайта VBStreets.ru, так что можно и кусочек кода, где изображения загр. в image показать..

ЗЫ: А изображения то на месте? А то может и грузить нечего?

Constant ERROR_SUCCESS deprecated. I'm so happy.
Программирование и дизайн – http://www.macrointellect.ru

Gfif21
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 71
Зарегистрирован: 31.05.2004 (Пн) 7:23

Сообщение Gfif21 » 13.12.2004 (Пн) 17:29

xolod писал(а):Уж сколько раз говорили, телепаты бросили нас еще на момент зарождения сайта VBStreets.ru, так что можно и кусочек кода, где изображения загр. в image показать..
Показать конечно можно:
Код: Выделить всё
Image(1).Picture = LoadPicture(App.Path & "\Bitmap\Picture1.gif")
Image(2).Picture = LoadPicture(App.Path & "\Bitmap\Picture2.gif")
Image(3).Picture = LoadPicture(App.Path & "\Bitmap\Picture3.gif")


xolod писал(а):ЗЫ: А изображения то на месте? А то может и грузить нечего?
Конечно на месте

xolod
Гуру
Гуру
 
Сообщения: 1162
Зарегистрирован: 15.01.2004 (Чт) 0:42
Откуда: Moscow

Сообщение xolod » 13.12.2004 (Пн) 17:41

Да вроде правильно все.. непонятно :?

Constant ERROR_SUCCESS deprecated. I'm so happy.
Программирование и дизайн – http://www.macrointellect.ru

Gfif21
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 71
Зарегистрирован: 31.05.2004 (Пн) 7:23

Сообщение Gfif21 » 13.12.2004 (Пн) 18:34

xolod писал(а):Да вроде правильно все.. непонятно :?
Мда, сам ничего не понимаю. Если сделать картинки jpg или bmp и в коде поменять расширения, то все работает. Но все дело в том, что эти картинки заполняют не всю прямоугольную облсть (есть прозрачные фрагменты) и gif как раз эту прозрачность сохраняет, а jpg и bmp при сохранении заполняют прозрачные области белым цветом.

Ну тогда такой момент интересует: вот я вставил картинку в Image - могу я узнать цвет пикселя на этой картинке с определенными координатами (ну какие-нибудь X,Y)?

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 13.12.2004 (Пн) 18:48

Метод Point есть у PictureBox. У Image нету.
Изображение

Ariman
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 817
Зарегистрирован: 02.09.2003 (Вт) 16:23
Откуда: Великая наша держава, г.Москва

Сообщение Ariman » 13.12.2004 (Пн) 18:57

Point это очень медленно. Лучше GetPixel

Ariman
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 817
Зарегистрирован: 02.09.2003 (Вт) 16:23
Откуда: Великая наша держава, г.Москва

Сообщение Ariman » 13.12.2004 (Пн) 18:59

А вообще, это тебе для чего? Может, лучше прозрачность реализовать чем-нибудь другим, скажем, BitBlt......

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 13.12.2004 (Пн) 19:07

Точнее, TransparentBlt ;-)

Код: Выделить всё
Declare Function TransparentBlt Lib "msimg32.dll" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal nSrcWidth As Long, ByVal nSrcHeight As Long, ByVal crTransparent As Long) As Boolean


crTransparent - цвет участков, которые будут прозрачными. Скажем, RGB(0,0,255).

Ariman
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 817
Зарегистрирован: 02.09.2003 (Вт) 16:23
Откуда: Великая наша держава, г.Москва

Сообщение Ariman » 13.12.2004 (Пн) 19:19

Ну, тут все от нужд зависит. Может, человек игру пишет? Тогда лучше BitBlt'ить рисунки с масочкой.......

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 13.12.2004 (Пн) 19:29

Да, в этом случае вполне согласен.

Gfif21
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 71
Зарегистрирован: 31.05.2004 (Пн) 7:23

Сообщение Gfif21 » 13.12.2004 (Пн) 20:46

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

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 13.12.2004 (Пн) 22:18

Один из способов - через мою чудо-обёртку ( http://bbs.vbstreets.ru/viewtopic.php?p=76589#76589 )...
Подойдёт?
Изображение

xolod
Гуру
Гуру
 
Сообщения: 1162
Зарегистрирован: 15.01.2004 (Чт) 0:42
Откуда: Moscow

Сообщение xolod » 13.12.2004 (Пн) 22:28

Ой, не могу... Опять реклама чудо-фантика :lol:

Constant ERROR_SUCCESS deprecated. I'm so happy.
Программирование и дизайн – http://www.macrointellect.ru

Gfif21
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 71
Зарегистрирован: 31.05.2004 (Пн) 7:23

Сообщение Gfif21 » 14.12.2004 (Вт) 10:27

Ariman писал(а):Point это очень медленно. Лучше GetPixel
А не подскажешь как с GetPixel работать. Ну например, в PictureBox Picture1 загружен рисунок, как узнать цвет пикселя с координатами 60,60.

Gfif21
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 71
Зарегистрирован: 31.05.2004 (Пн) 7:23

Сообщение Gfif21 » 14.12.2004 (Вт) 11:05

Gfif21 писал(а):
Ariman писал(а):Point это очень медленно. Лучше GetPixel
А не подскажешь как с GetPixel работать. Ну например, в PictureBox Picture1 загружен рисунок, как узнать цвет пикселя с координатами 60,60.
Ну с GetPixel разобрался - полазил по форуму, и все, что надо, нашел, все работает. Теперь интересует , можно ли из этого восьмизначного числа получить цвет в RGB.

Mleha
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 146
Зарегистрирован: 06.10.2004 (Ср) 7:49
Откуда: Ангарск

Сообщение Mleha » 14.12.2004 (Вт) 11:19

Private Type rgbq
red As Double
green As Double
blue As Double
End Type

Private Function Lngtorgb(color As Long) As rgbq
Lngtorgb.blue = color / 256 / 256
Lngtorgb.green = (color / 256) Mod 256
Lngtorgb.red = color Mod 256
End Function

Gfif21
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 71
Зарегистрирован: 31.05.2004 (Пн) 7:23

Сообщение Gfif21 » 14.12.2004 (Вт) 11:34

Пасиба

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 14.12.2004 (Вт) 12:45

Gfif21, ты что ли циклом по всем пикселам собрался определять, где прозрачно и где нет? :lol:
Изображение

xolod
Гуру
Гуру
 
Сообщения: 1162
Зарегистрирован: 15.01.2004 (Чт) 0:42
Откуда: Moscow

Сообщение xolod » 14.12.2004 (Вт) 13:16

Mleha
Мимо :lol:
Для голубого только так и никак иначе
Код: Выделить всё
B = Color \ 65536 Mod 256


Ну и конечно вместо / лучше использовать \, чем потом округлять :wink:

Constant ERROR_SUCCESS deprecated. I'm so happy.
Программирование и дизайн – http://www.macrointellect.ru

Gfif21
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 71
Зарегистрирован: 31.05.2004 (Пн) 7:23

Сообщение Gfif21 » 14.12.2004 (Вт) 13:23

tyomitch писал(а):Gfif21, ты что ли циклом по всем пикселам собрался определять, где прозрачно и где нет? :lol:
Не, типа я не сумашедший. Просто я закрасил в картинках пустые места цветом фона окна. Но появилась небольшая проблема: вот я закрасил пустые места цветом (223,233,243). Потом я загружаю картинку в Имедж и делаю таким же цветом фон окна Form1.backcolor = RGB (223,233,243). Но когда я запускаю проект у меня цвет на картинке меняется (вот с помощью GetPixel установил, что он почему-то становится (224,241,249)) и не совпадает с цветом фона (визуально это хорошо видно). Вот не пойму никак, почему цвет меняется. :roll:

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 14.12.2004 (Вт) 18:20

Gfif21 писал(а):
tyomitch писал(а):Gfif21, ты что ли циклом по всем пикселам собрался определять, где прозрачно и где нет? :lol:
Не, типа я не сумашедший. Просто я закрасил в картинках пустые места цветом фона окна.

Тоже, кстати, нехорошо. Если цвет окна изменят, картинка опять будет на квадратном фоне.
Тебе же уже посоветовали TransparentBlt ? С ним твоя задача решилась бы в пару строк. И никакого GetPixel-а не надо :-)
Изображение

Gfif21
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 71
Зарегистрирован: 31.05.2004 (Пн) 7:23

Сообщение Gfif21 » 14.12.2004 (Вт) 19:26

tyomitch писал(а):
Gfif21 писал(а):
tyomitch писал(а):Gfif21, ты что ли циклом по всем пикселам собрался определять, где прозрачно и где нет? :lol:
Не, типа я не сумашедший. Просто я закрасил в картинках пустые места цветом фона окна.

Тоже, кстати, нехорошо. Если цвет окна изменят, картинка опять будет на квадратном фоне.
Тебе же уже посоветовали TransparentBlt ? С ним твоя задача решилась бы в пару строк. И никакого GetPixel-а не надо :-)
Может дашь пример синтаксиса TransparentBlt, а то я полазил по форуму и нашел только как эта функция объявляется, а что в коде писать не знаю.

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 14.12.2004 (Вт) 19:32

Код: Выделить всё
'This project needs 2 pictureboxes
'Picturebox1 must contain a picture with a lot of white pixels (we're going to use white as transparent color)
Private Declare Function TransparentBlt Lib "msimg32.dll" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal nSrcWidth As Long, ByVal nSrcHeight As Long, ByVal crTransparent As Long) As Boolean
Private Sub Form_Load()
    'KPD-Team 1999
    'URL: http://www.allapi.net/
    'E-Mail: KPDTeam@Allapi.net
    Picture1.AutoSize = True
    'API uses pixels
    Picture1.ScaleMode = vbPixels
    Picture2.ScaleMode = vbPixels
End Sub
Private Sub Picture2_Paint()
    'If we don't call DoEvents first, our transparent image will be completely wrong
    DoEvents
    TransparentBlt Picture2.hdc, 0, 0, Picture2.ScaleWidth, Picture2.ScaleHeight, Picture1.hdc, 0, 0, Picture1.ScaleWidth, Picture1.ScaleHeight, vbWhite
End Sub


Только не спрашивай, что должно быть на форме :lol:

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 14.12.2004 (Вт) 19:44

Да без проблем.


[edit]гы, слишком долго стряпал...[/edit]
Вложения
Form1.rar
(2.77 Кб) Скачиваний: 27
Изображение

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 14.12.2004 (Вт) 19:50

Предложил бы несколько иной пример:

TransparentBlt Picture2.hdc, 0, 0, Picture2.ScaleWidth, Picture2.ScaleHeight, Picture1.hdc, 0, 0, Picture1.ScaleWidth, Picture1.ScaleHeight, RGB(0, 0, 0)

И у Picture2 красный BackColor... Так нагляднее, нет?

Gfif21
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 71
Зарегистрирован: 31.05.2004 (Пн) 7:23

Сообщение Gfif21 » 14.12.2004 (Вт) 19:56

Вот спасибо вам, люди. Теперь усе понятно.

Amed писал(а):Предложил бы несколько иной пример:

TransparentBlt Picture2.hdc, 0, 0, Picture2.ScaleWidth, Picture2.ScaleHeight, Picture1.hdc, 0, 0, Picture1.ScaleWidth, Picture1.ScaleHeight, RGB(0, 0, 0)

И у Picture2 красный BackColor... Так нагляднее, нет?

Так если BackColor красный, то наверное надо писать RGB(255,0,0)

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 14.12.2004 (Вт) 19:56

У меня серо-синий BackColor - куда уж нагляднее?
Изображение

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 14.12.2004 (Вт) 19:58

Хм. У меня был серый... :/

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 14.12.2004 (Вт) 20:06

Gfif21, я верно написал, всё-таки. Просто, если у Пикчера2 ярко-красный фон был, то после нажатия на кнопку текст должен был стать не чёрным, а красным (читай, прозрачным, а сквозь него виден пикчербокс)...

След.

Вернуться в Visual Basic 1–6

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

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

    TopList  
cron