HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2011
0212
ポチ背景を透過させてPNGファイルを表示したいのですが・・・6解決


ポチ

リンク

2011/2/12(Sat) 00:14:58|NO.37020

背景を透過させてPNGファイルを表示したいのですが・・・
透明部分が白になってしまって上手く行きません。


#include "mod_img.as" bgscr 0,400,400,, dialog "png", 16 if stat = 0 : stop imgload refstr stop

そこで不定形リージョンのサンプルを使って、

; ※888さん作成の2.6x版をHSP3用に移植したものです。 #include "mod_img.as" #uselib "user32.dll" #func SetWindowLong "SetWindowLongA" int,int,int hwnd_=hwnd screen 3,,,10 SetWindowLong hwnd_,-8,hwnd buffer 3,1,1,2 #uselib "user32.dll" #func SetLayeredWindowAttributes "SetLayeredWindowAttributes" int,int,int,int #const LWA_COLORKEY 1 #const LWA_ALPHA 2 #const GWL_EXSTYLE -20 #const WS_EX_LAYERED $00080000 #module #uselib "kernel32.dll" #cfunc LoadLibrary "LoadLibraryA" sptr #cfunc GetProcAddress "GetProcAddress" int,sptr #func FreeLibrary "FreeLibrary" int #deffunc dllload str prm1 pdll=LoadLibrary(prm1) if pdll==0 : return -1 return pdll #deffunc funcprocadr var prm1,int prm2,str prm3 funcptr=GetProcAddress(prm2,prm3) if funcptr==0 : return -1 prm1=funcptr return 0 #deffunc funcproc var prm1,array prm2,int prm3,int prm4 prm1=callfunc (prm2,prm3,prm4) return 0 #deffunc dllfree int prm1 FreeLibrary prm1 return #global #uselib "kernel32.dll" #func VirtualProtect "VirtualProtect" var,int,int,var #define xdim(%1,%2)dim %1,%2 : VirtualProtect %1,(%2)*4,$40,AZSD #define obj_wmnclbtndown sendmsg hwnd,$00A1,2,0 gsel 0,-1 *load bgscr 2,,,2 dialog " *",16: if stat!1 : end picload refstr alpha = 255 ; 0〜255 SetWindowLong hwnd,-20,WS_EX_LAYERED SetLayeredWindowAttributes hwnd,0,alpha,LWA_ALPHA pget 0,0 color ginfo(16),ginfo(17),ginfo(18) xdim code,153 code(0) =$83EC8B55,$5653B8C4,$C458B57,$508B188B,$E0558904,$8908488B,$508BDC4D,$D855890C code(8) =$8910488B,$508BD44D,$D0558914,$8918488B,$408BCC4D,$C845891C,$8B08458B,$55891450 code(16) =$84D8BC4,$890C418B,$558BC045,$44A8B08,$8BBC4D89,$508B0845,$B8558908,$8B084D8B code(24) =$A081,$FC458900,$C07D83,$45C70974,$01EC,$C707EB00,$3EC45,$558B0000 code(32) =$55AF0FBC,$E85589EC,$81E84D8B,$03E1,$49057980,$41FCC983,$04B8,$25C12B00 code(40) =$80000003,$83480579,$8940FCC8,$45C7E845,$64F8,$F8558B00,$8304E2C1,$6A5220C2 code(48) =$89D3FF02,$4D8BE445,$55FF51E4,$33F88BDC,$2007C7C0,$8D000000,$47C71057,$0104 code(56) =$C478900,$6A084789,$6A006A00,$52006A00,$33D055FF,$F44D89C9,$3BF4458B,$8D0FB845 code(64) =$0131,$48B8458B,$8BF4452B,$AF0FE855,$FD88BD0,$FBC5DAF,$3EC5DAF,$DA03C45D code(72) =$753BF633,$FB8D0FBC,$83000000,$7400C07D,$8AC03306,$3318EB03,$8AD233C0,$38A0153 code(80) =$3308E2C1,$10E0C1C9,$B024B8A,$3BC10BC2,$840FFC45,$00C1,$46F07589,$7DBC753B code(88) =$EC5D0332,$C07D83,$C0330674,$18EB038A,$D233C033,$8A01538A,$8E2C103,$E0C1C933 code(96) =$24B8A10,$C10BC20B,$74FC453B,$753B4606,$8BCE7CBC,$453B0847,$8B2A72F8,$FF52E455 code(104)=$4583D855,$26A64F8,$C1F84D8B,$C18304E1,$458B5120,$55FF50E4,$E44589E0,$52E4558B code(112)=$8BDC55FF,$20478DF8,$42F4558B,$4D8B5652,$558B51F4,$4F8B52F0,$4E1C108,$FF50C103 code(120)=$478BD055,$F0453B10,$458B067E,$104789F0,$3B14578B,$67EF455,$89F44D8B,$773B144F code(128)=$89037E18,$458B1877,$473B40F4,$8B077E1C,$8942F455,$47FF1C57,$EC5D0308,$BC753B46 code(136)=$FF058C0F,$45FFFFFF,$F44D8BF4,$FB84D3B,$FFFECF8C,$458B57FF,$4E0C1F8,$5020C083 code(144)=$55FF006A,$6AD88BCC,$458B5301,$34508B08,$C855FF52,$51E44D8B,$8BD455FF,$5B5E5FC3 code(152)=$C25DE58B,0 ;▼呼び出す関数のアドレスを格納 dllload "kernel32.dll" : D_KERNEL=stat dllload "user32.dll" : D_USER=stat dllload "gdi32.dll" : D_GDI=stat funcprocadr func(0),D_KERNEL,"GlobalAlloc" funcprocadr func(1),D_KERNEL,"GlobalReAlloc" funcprocadr func(2),D_KERNEL,"GlobalLock" funcprocadr func(3),D_KERNEL,"GlobalUnlock" funcprocadr func(4),D_KERNEL,"GlobalFree" funcprocadr func(5),D_USER, "SetRect" funcprocadr func(6),D_GDI, "ExtCreateRegion" funcprocadr func(7),D_USER, "SetWindowRgn" pfunc=varptr(code) mref bmscr,67 ;▼関数パラメータを指定 prm=varptr(bmscr),varptr(func) ;▼関数実行 funcproc dllret,prm,pfunc,2 if dllret=0:dialog "作成に失敗しました":end gsel 2,1 redraw 1 onclick *move stop *move if wparam==2 { dllfree D_KERNEL : dllfree D_USER : dllfree D_GDI end } if wparam == 1 { obj_wmnclbtndown } : stop stop
表示したいのですが、"picload refstr "を"imgload refstr"に変えたら上手く行きません。
できればこのスクリプトを使った形で(そうでなくても良いのですが・・・)
枠なしPNGファイルを表示したいのですが・・・。



この記事に返信する


hexa.hemi

リンク

2011/2/12(Sat) 00:42:59|NO.37021

あくまで推測ですが、このプログラムではx座標0,y座標0(左上)の位置の色を
背景色にしているので左上の色が背景色になっていないとうまくいかないかもしれません。


/* #include "mod_img.as" bgscr 0,400,400,, dialog "png", 16 if stat = 0 : stop imgload refstr stop そこで不定形リージョンのサンプルを使って、 */ ; ※888さん作成の2.6x版をHSP3用に移植したものです。 #include "mod_img.as" #uselib "user32.dll" #func SetWindowLong "SetWindowLongA" int,int,int hwnd_=hwnd screen 3,,,10 SetWindowLong hwnd_,-8,hwnd buffer 3,1,1,2 #uselib "user32.dll" #func SetLayeredWindowAttributes "SetLayeredWindowAttributes" int,int,int,int #const LWA_COLORKEY 1 #const LWA_ALPHA 2 #const GWL_EXSTYLE -20 #const WS_EX_LAYERED $00080000 #module #uselib "kernel32.dll" #cfunc LoadLibrary "LoadLibraryA" sptr #cfunc GetProcAddress "GetProcAddress" int,sptr #func FreeLibrary "FreeLibrary" int #deffunc dllload str prm1 pdll=LoadLibrary(prm1) if pdll==0 : return -1 return pdll #deffunc funcprocadr var prm1,int prm2,str prm3 funcptr=GetProcAddress(prm2,prm3) if funcptr==0 : return -1 prm1=funcptr return 0 #deffunc funcproc var prm1,array prm2,int prm3,int prm4 prm1=callfunc (prm2,prm3,prm4) return 0 #deffunc dllfree int prm1 FreeLibrary prm1 return #global #uselib "kernel32.dll" #func VirtualProtect "VirtualProtect" var,int,int,var #define xdim(%1,%2)dim %1,%2 : VirtualProtect %1,(%2)*4,$40,AZSD #define obj_wmnclbtndown sendmsg hwnd,$00A1,2,0 gsel 0,-1 *load bgscr 2,,,2 dialog "png",16: if stat!1 : end hr = 255 : hg = 255 : hb = 255// 画像に使われていない色を代入する color hr, hg, hb boxf imgload refstr alpha = 255 ; 0〜255 SetWindowLong hwnd,-20,WS_EX_LAYERED SetLayeredWindowAttributes hwnd,0,alpha,LWA_ALPHA color hr, hg, hb xdim code,153 code(0) =$83EC8B55,$5653B8C4,$C458B57,$508B188B,$E0558904,$8908488B,$508BDC4D,$D855890C code(8) =$8910488B,$508BD44D,$D0558914,$8918488B,$408BCC4D,$C845891C,$8B08458B,$55891450 code(16) =$84D8BC4,$890C418B,$558BC045,$44A8B08,$8BBC4D89,$508B0845,$B8558908,$8B084D8B code(24) =$A081,$FC458900,$C07D83,$45C70974,$01EC,$C707EB00,$3EC45,$558B0000 code(32) =$55AF0FBC,$E85589EC,$81E84D8B,$03E1,$49057980,$41FCC983,$04B8,$25C12B00 code(40) =$80000003,$83480579,$8940FCC8,$45C7E845,$64F8,$F8558B00,$8304E2C1,$6A5220C2 code(48) =$89D3FF02,$4D8BE445,$55FF51E4,$33F88BDC,$2007C7C0,$8D000000,$47C71057,$0104 code(56) =$C478900,$6A084789,$6A006A00,$52006A00,$33D055FF,$F44D89C9,$3BF4458B,$8D0FB845 code(64) =$0131,$48B8458B,$8BF4452B,$AF0FE855,$FD88BD0,$FBC5DAF,$3EC5DAF,$DA03C45D code(72) =$753BF633,$FB8D0FBC,$83000000,$7400C07D,$8AC03306,$3318EB03,$8AD233C0,$38A0153 code(80) =$3308E2C1,$10E0C1C9,$B024B8A,$3BC10BC2,$840FFC45,$00C1,$46F07589,$7DBC753B code(88) =$EC5D0332,$C07D83,$C0330674,$18EB038A,$D233C033,$8A01538A,$8E2C103,$E0C1C933 code(96) =$24B8A10,$C10BC20B,$74FC453B,$753B4606,$8BCE7CBC,$453B0847,$8B2A72F8,$FF52E455 code(104)=$4583D855,$26A64F8,$C1F84D8B,$C18304E1,$458B5120,$55FF50E4,$E44589E0,$52E4558B code(112)=$8BDC55FF,$20478DF8,$42F4558B,$4D8B5652,$558B51F4,$4F8B52F0,$4E1C108,$FF50C103 code(120)=$478BD055,$F0453B10,$458B067E,$104789F0,$3B14578B,$67EF455,$89F44D8B,$773B144F code(128)=$89037E18,$458B1877,$473B40F4,$8B077E1C,$8942F455,$47FF1C57,$EC5D0308,$BC753B46 code(136)=$FF058C0F,$45FFFFFF,$F44D8BF4,$FB84D3B,$FFFECF8C,$458B57FF,$4E0C1F8,$5020C083 code(144)=$55FF006A,$6AD88BCC,$458B5301,$34508B08,$C855FF52,$51E44D8B,$8BD455FF,$5B5E5FC3 code(152)=$C25DE58B,0 ;▼呼び出す関数のアドレスを格納 dllload "kernel32.dll" : D_KERNEL=stat dllload "user32.dll" : D_USER=stat dllload "gdi32.dll" : D_GDI=stat funcprocadr func(0),D_KERNEL,"GlobalAlloc" funcprocadr func(1),D_KERNEL,"GlobalReAlloc" funcprocadr func(2),D_KERNEL,"GlobalLock" funcprocadr func(3),D_KERNEL,"GlobalUnlock" funcprocadr func(4),D_KERNEL,"GlobalFree" funcprocadr func(5),D_USER, "SetRect" funcprocadr func(6),D_GDI, "ExtCreateRegion" funcprocadr func(7),D_USER, "SetWindowRgn" pfunc=varptr(code) mref bmscr,67 ;▼関数パラメータを指定 prm=varptr(bmscr),varptr(func) ;▼関数実行 funcproc dllret,prm,pfunc,2 if dllret=0:dialog "作成に失敗しました":end gsel 2,1 redraw 1 onclick *move stop *move if wparam==2 { dllfree D_KERNEL : dllfree D_USER : dllfree D_GDI end } if wparam == 1 { obj_wmnclbtndown } : stop stop



GENKI

リンク

2011/2/12(Sat) 00:51:13|NO.37022

> 透明部分が白になってしまって上手く行きません。

白の上に透明色を塗ったら白ですよね。
何色に見える予定だったんですか?


とりあえずサンプルを2つ紹介します。画像はWikipediaから入手してください。
http://upload.wikimedia.org/wikipedia/commons/4/47/PNG_transparency_demonstration_1.png

表示するだけならこんな感じ。

;IE7以降必須 #include "mod_img.as" ;背景作成 repeat 100 s="" repeat 50 s += "背景 " loop mes s loop ;読み込み title "ロード中..." imgload "http://upload.wikimedia.org/wikipedia/commons/4/47/PNG_transparency_demonstration_1.png" title "表示完了"


透明色を含めてコピーや加工したいならArtlet2Dを使ってください。

#include "a2d.hsp" ;背景作成 repeat 100 s="" repeat 50 s += "背景 " loop mes s loop ; 仮想イメージ IMG_PNG を画像ファイルから作成 alCreateImageByFile 0, "PNG_transparency_demonstration_1.png" if stat = -1 { dialog "GDI+ を初期化できませんでした。" end } alCopyImageToScreen 0,0 redraw stop


> 枠なしPNGファイルを表示したいのですが・・・。

PNGファイルにそもそも枠はありませんが…。
「枠」とは何でしょうか?



GENKI

リンク

2011/2/12(Sat) 01:11:29|NO.37024

ん、不定形リージョン?しまったそういうこと…なのかな。
PNGの表示じゃなくて画像を使った不定形リージョンをやりたかったんでしょうか。
おそらく、PNGで手軽に出来るんじゃないかと思ったってことですか。

もしそうならこちらがお役に立つかと思います。
http://d.hatena.ne.jp/As_hsp/20091213/1260714763

あ、半透明部分も反映させたいってことなら私は分からないので他の方お願いします。



ポチ

リンク

2011/2/12(Sat) 02:49:31|NO.37027

hexa.hemiさま、GENKIさまレスありがとうございます。

何時もながら、説明が不十分で申し訳ありません。

部分的に透明度が違う画像を使ったデスクトップマスコットみたいなモノを作りたいのです。
たとえば金魚のヒレやシャボン玉をデスクトップ上で動かしたいのです。

普通不定形リージョン+半透明処理を使うと半透明のマスコットは出来るのですが、透明度が
一様になってしまって、シャボン玉や金魚のヒレとかはリアルさがイマイチなんです。


(もしかすると難し過ぎて、自分には分からないかも知れませんが・・・)

よろしくお願い致します。



GENKI

リンク

2011/2/12(Sat) 14:28:20|NO.37031

> 部分的に透明度が違う画像を使ったデスクトップマスコットみたいなモノを作りたいのです。

なるほど。

今思いつきました。スクリーンキャプチャ使うのはどうでしょう?
http://tokyo.cool.ne.jp/chokuto/advanced/capturescreen.html
背景画像にスクリーンキャプチャ画像を使うわけです。
…ん?キャプチャ時に自分自身も映りこんじゃうのかな?


ところで調べてみたら機能は用意されているらしく、レイヤードウィンドウというものがあるらしいのですが…使い方はよく分からないです。



ポチ

リンク

2011/2/12(Sat) 17:22:51|NO.37042

GENKIさま親切丁寧なアドバイスありがとうございます。
スクリーンキャプチャとレイヤードウィンドウ
レイヤードウィンドウが使えれば何とかなりそうです!!
早速勉強してみます。

より美しくリアルなデスクトップアクセサリー頑張って作ってみます。



ONION software Copyright 1997-2023(c) All rights reserved.