Проблема с PNG

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
xaser
Начинающий
Начинающий
 
Сообщения: 13
Зарегистрирован: 22.10.2002 (Вт) 5:03
Откуда: Ukraine

Проблема с PNG

Сообщение xaser » 19.09.2009 (Сб) 19:23

Помогите кто чем может...

Нужно на раскрашенную форму программно "положить" четыре PNG с альфой...

Вот примерная прораммка.. В ней могу положить только 1 ПНГ!!! ((( ... да к тому же и на НЕ раскрашенную форму! (Не кладется ПНГ без Me.CLS) .. (((

Помогите!

max.rar
(113.88 Кб) Скачиваний: 135

HiSER
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 88
Зарегистрирован: 04.07.2007 (Ср) 18:17

Re: Проблема с PNG

Сообщение HiSER » 19.09.2009 (Сб) 20:01

У меня все нарисовалась и первая и вторая картинка, у второй координаты поставил 100x100 ибо она за пределами формы рисуется.
Вложения
1.JPG
1.JPG (29.81 Кб) Просмотров: 4901

xaser
Начинающий
Начинающий
 
Сообщения: 13
Зарегистрирован: 22.10.2002 (Вт) 5:03
Откуда: Ukraine

Re: Проблема с PNG

Сообщение xaser » 19.09.2009 (Сб) 22:20

:shock: :D Выходит я правильно всё оформил?!... Просто лох, не догадался растянуть форму!!! )))))))))))

HiSER СПАСИБО! А то сижу... жду.. время идет... ))) СПАСИБО!

xaser
Начинающий
Начинающий
 
Сообщения: 13
Зарегистрирован: 22.10.2002 (Вт) 5:03
Откуда: Ukraine

Re: Проблема с PNG

Сообщение xaser » 21.09.2009 (Пн) 0:00

Снова поднимаю вопрос! :rolleyes:

Хочу усовершенствовать... ))
Вобщем есть форма... накрашенный фон с помощью PaintPicture ... сверху наляпаны пара ПНГ... теперь нужно обрезать излишек формы!
Вот СКРИН... на нем форма - это серый цвет... его нужно сделать прозрачным...
Изображение

(хочу что-то в духе этого...)
Изображение

Собственно исходник со всеми необходимыми функциями.. Прошу подправить!
max.rar
(95.75 Кб) Скачиваний: 123

xaser
Начинающий
Начинающий
 
Сообщения: 13
Зарегистрирован: 22.10.2002 (Вт) 5:03
Откуда: Ukraine

Re: Проблема с PNG

Сообщение xaser » 21.09.2009 (Пн) 1:08

Не... обрезать-то обрезало, но "криво"!

вот результат:
Изображение

zHackLeX
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 23.10.2003 (Чт) 21:08

Re: Проблема с PNG

Сообщение zHackLeX » 21.09.2009 (Пн) 2:36

SetLayeredWindowAttributes, LWA_COLORKEY?
Чую, что нужно per-pixel alpha, что достигается только через UpdateLayeredWindow...
There is no knowledge that is not power...

X,C,A,B,C,Z,X,A,B,C,Z....
Многие ли помнят? :)

xaser
Начинающий
Начинающий
 
Сообщения: 13
Зарегистрирован: 22.10.2002 (Вт) 5:03
Откуда: Ukraine

Re: Проблема с PNG

Сообщение xaser » 21.09.2009 (Пн) 2:50

ну да, UpdateLayeredWindow !!!

В том примере, что я выложил, это реализовано...
НО!!! Так как я:
1. Рисую фон
2. Рисую первый ПНГ
3. Рисую второй ПНГ

и только после этого вызываю UpdateLayeredWindow (со ссылкой на последнее изображение, иначе не умею), то форма обрезается по последнему ПНГ!!!...
Короче говоря в UpdateLayeredWindow нужно передать как-то ВСЮ композицию... а как?

zHackLeX
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 23.10.2003 (Чт) 21:08

Re: Проблема с PNG

Сообщение zHackLeX » 21.09.2009 (Пн) 3:08

Во-первых, кто мешает полностью нарисовать png, содержащий и фон, и полупрозрачные картинки?
Во-вторых, на всякий случай, http://www.codeproject.com/KB/GDI/pxalphablend.aspx
Здесь рабочий пример в точности того, что тебе требуется, но на С++. Если языкового
барьера нет - легко увидишь, как что сделано. Если нет аккаунта на CP и не можешь
скачать, прилагаю аттач.

В любом случае, если надумаешь компилить сабж (компилить лучше в vs2005+) и
компилер заругается (а он заругается на строчке ON_WM_NCHITTEST() ),
замени её (это #define-макрос) на
Код: Выделить всё
   { WM_NCHITTEST, 0, 0, 0, AfxSig_l_p,
   (AFX_PMSG)(AFX_PMSGW)
   (static_cast< UINT (AFX_MSG_CALL CWnd::*)(CPoint) > (&ThisClass :: OnNcHitTest)) },

запятая в конце - должна быть, это нормально. После этого пример запустится.
В статье автор указал, где ключевые моменты реализации, куда смотреть в код.
Надеюсь, чем-то помог... в 4 часа ночи уже залипаю, сил нет.
Вложения
rgl_perpxalpha_src.zip
(187.97 Кб) Скачиваний: 464
There is no knowledge that is not power...

X,C,A,B,C,Z,X,A,B,C,Z....
Многие ли помнят? :)

xaser
Начинающий
Начинающий
 
Сообщения: 13
Зарегистрирован: 22.10.2002 (Вт) 5:03
Откуда: Ukraine

Re: Проблема с PNG

Сообщение xaser » 21.09.2009 (Пн) 3:19

zHackLeX писал(а):Во-первых, кто мешает полностью нарисовать png, содержащий и фон, и полупрозрачные картинки?

дык я ж только ЗА! Но я не умею... ( ... оттого и обратился за помощью...
zHackLeX писал(а):Во-вторых, на всякий случай, http://www.codeproject.com/KB/GDI/pxalphablend.aspx
Здесь рабочий пример в точности того, что тебе требуется, но на С++. Если языкового
барьера нет - легко увидишь, как что сделано. Если нет аккаунта на CP и не можешь
скачать, прилагаю аттач.

В любом случае, если надумаешь компилить сабж (компилить лучше в vs2005+) и
компилер заругается (а он заругается на строчке ON_WM_NCHITTEST() ),
замени её (это #define-макрос) на
Код: Выделить всё
   { WM_NCHITTEST, 0, 0, 0, AfxSig_l_p,
   (AFX_PMSG)(AFX_PMSGW)
   (static_cast< UINT (AFX_MSG_CALL CWnd::*)(CPoint) > (&ThisClass :: OnNcHitTest)) },

запятая в конце - должна быть, это нормально. После этого пример запустится.
В статье автор указал, где ключевые моменты реализации, куда смотреть в код.
Надеюсь, чем-то помог... в 4 часа ночи уже залипаю, сил нет.

К сожалению С++ не знаю, разобраться не смогу. VS2005 у меня нет... только Васик_6 и всё... остальные сильно отличаются от него...

zHackLeX
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 23.10.2003 (Чт) 21:08

Re: Проблема с PNG

Сообщение zHackLeX » 21.09.2009 (Пн) 3:44

Что, нет редакторов PNG, работающих с альфа-каналом? 0_о
Или UpdateLayeredWindow даже ОДНУ БОЛЬШУЮ png не натянет
на форму так, чтобы альфа-канал png определял степень прозрачности
каждого отдельного пикселя формы?

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


Ну, дождись утра, попробую тот код перетащить на vb6...
There is no knowledge that is not power...

X,C,A,B,C,Z,X,A,B,C,Z....
Многие ли помнят? :)

xaser
Начинающий
Начинающий
 
Сообщения: 13
Зарегистрирован: 22.10.2002 (Вт) 5:03
Откуда: Ukraine

Re: Проблема с PNG

Сообщение xaser » 21.09.2009 (Пн) 3:54

zHackLeX писал(а):Что, нет редакторов PNG, работающих с альфа-каналом? 0_о
Или UpdateLayeredWindow даже ОДНУ БОЛЬШУЮ png не натянет на форму так, чтобы альфа-канал png определял степень прозрачности каждого отдельного пикселя формы?

Так весь смысл в том, что у меня 30 разных ПНГ... в реалиях - нужно программно выбирать определенные 4 и загружать на форму (на фон)... что ж мне вручную все комбинации делать????
Дабы не быть голословным, вот где используется:
Изображение



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

Я вообще не программист... так, знаю немного....

zHackLeX
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 23.10.2003 (Чт) 21:08

Re: Проблема с PNG

Сообщение zHackLeX » 21.09.2009 (Пн) 15:27

Проверь ЛС, не будем флудить в форуме, просто скинем сюда, если что получится.
There is no knowledge that is not power...

X,C,A,B,C,Z,X,A,B,C,Z....
Многие ли помнят? :)

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Re: Проблема с PNG

Сообщение Antonariy » 21.09.2009 (Пн) 16:00

xaser писал(а):Не... обрезать-то обрезало, но "криво"!
вот результат:

А у меня вообще ничего не обрезало.
Если заменить
Код: Выделить всё
    Me.PaintPicture P.Picture, 50, 50, Me.ScaleWidth - 50 + 230 / IIf(Me.ScaleMode = vbPixels, 15, 1), Me.ScaleHeight - 50 + 230 / IIf(Me.ScaleMode = vbPixels, 15, 1), 0, 0, P.Width, P.Height, vbSrcCopy
на
Код: Выделить всё
Private Declare Function StretchBlt Lib "gdi32" (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 dwRop As Long) As Long
Private Declare Function SetStretchBltMode Lib "gdi32" (ByVal hDC As Long, ByVal hStretchMode As Long) As Long

    Call SetStretchBltMode(Me.hDC, vbPaletteModeNone)
    Call StretchBlt(Me.hDC, 50, 50, Me.ScaleWidth - 50 + 230 / IIf(Me.ScaleMode = vbPixels, 15, 1), Me.ScaleHeight - 50 + 230 / IIf(Me.ScaleMode = vbPixels, 15, 1), P.hDC, 0, 0, 122, 77, vbSrcCopy)
то можно размыть фон.
Вложения
form1.png
form1.png (49.06 Кб) Просмотров: 5028
Лучший способ понять что-то самому — объяснить это другому.

xaser
Начинающий
Начинающий
 
Сообщения: 13
Зарегистрирован: 22.10.2002 (Вт) 5:03
Откуда: Ukraine

Re: Проблема с PNG

Сообщение xaser » 21.09.2009 (Пн) 16:21

а как это решает проблему? Тот же результат, что и в моем примере...

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Re: Проблема с PNG

Сообщение Antonariy » 21.09.2009 (Пн) 16:32

Да никак, просто растянутые пиксели глаз резали. Мало ли, пригодится.
Лучший способ понять что-то самому — объяснить это другому.

xaser
Начинающий
Начинающий
 
Сообщения: 13
Зарегистрирован: 22.10.2002 (Вт) 5:03
Откуда: Ukraine

Re: Проблема с PNG

Сообщение xaser » 21.09.2009 (Пн) 16:44

а! Да! Теперь вижу! Спасибо!!! Использую!!!

xaser
Начинающий
Начинающий
 
Сообщения: 13
Зарегистрирован: 22.10.2002 (Вт) 5:03
Откуда: Ukraine

Re: Проблема с PNG

Сообщение xaser » 21.09.2009 (Пн) 22:19

Еще вопрос! Как мне загрузить картинку, но из PictureBox ??? GdipLoadImageFromStream???? или какая-то другая функция?
вот исходник КУДА нужно запихнуть:
Код: Выделить всё
    Call GdipLoadImageFromFile(StrConv(strPNGFile, vbUnicode), hImage(0))
    Call GdipGetImageHeight(hImage(0), H)
    Call GdipGetImageWidth(hImage(0), W)
    Call GdipDrawImageRect(hGraphics, hImage(0), 0, 0, W, H)


так?
Код: Выделить всё
    Call GdipLoadImageFromStream(Picture1.Picture, hImage(0))
    Call GdipGetImageHeight(hImage(0), H)
    Call GdipGetImageWidth(hImage(0), W)
    Call GdipDrawImageRect(hGraphics, hImage(0),0, 0, W, H)

xaser
Начинающий
Начинающий
 
Сообщения: 13
Зарегистрирован: 22.10.2002 (Вт) 5:03
Откуда: Ukraine

Re: Проблема с PNG

Сообщение xaser » 22.09.2009 (Вт) 1:04

Всё. Вопрос решен.
xaser.rar
(94.27 Кб) Скачиваний: 168

Изображение

_igor_
Новичок
Новичок
 
Сообщения: 47
Зарегистрирован: 25.08.2007 (Сб) 14:00

Re: Проблема с PNG

Сообщение _igor_ » 22.09.2009 (Вт) 11:36

Во вложении только .exe ;) Неплохо если бы автор поделился исходниками :) Многим бы пригодилось.

xaser
Начинающий
Начинающий
 
Сообщения: 13
Зарегистрирован: 22.10.2002 (Вт) 5:03
Откуда: Ukraine

Re: Проблема с PNG

Сообщение xaser » 22.09.2009 (Вт) 14:26

Лови исходник.
xaser.rar
(115.33 Кб) Скачиваний: 237

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Re: Проблема с PNG

Сообщение Antonariy » 30.10.2009 (Пт) 11:58

Глядя на всю эту красоту, возник такой вопрос: как в VB применить к непрозрачной картинке градиентный альфа-канал, допустим квадрат 100х100 от 100% непрозрачности до 50% в каком-нибудь направлении? Как должен выглядеть файл с альфа-каналом?
Лучший способ понять что-то самому — объяснить это другому.


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

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

Сейчас этот форум просматривают: AhrefsBot, Yandex-бот и гости: 55

    TopList