AkicanBlog

トップページ
雑  記
モバイル
ライフハック
ソフトウェア
HSPスクリプト
リンク

2009-12-13

HSP gmode 7用 アルファブレンド画像作成モジュール

概要

f:id:As_hsp:20091213233627j:image:left

 プログラミング言語HSPには,命令 gmodeの第一パラメータ gmode 7 にピクセルアルファブレンドコピーという機能がありますが,このピクセルアルファブレンドコピー用の画像を作成するためのモジュールです。

 PNG画像を読み込み,画像を作成します。作成されたピクセルアルファブレンドコピー用画像はモジュール内部で生成されたbufferに描画されます。

 背景を黒色として処理しているので明るい画像は黒く縁取りされて表示される場合があります。仕様です。

注意事項

 このモジュールはIE7以上でのみ正常に動作します。このモジュールを直接ソフトウェアに組み込む場合は,ソフトウェアに対し動作環境をIE7以上として明記する必要があります。

 これを望まない場合は,モジュールを使って作成したピクセルアルファブレンドコピー用画像をBMP等に出力したものを直接ソフトウェアに組み込み仕様すると良いです。

 ただし,内部で使用しているimgloadの部分を外部のPNG読み込みプラグインに置き換えることで動作環境を限定せずに使用することができます。

詳細

ライセンスご自由にお使いください。(NYSL
対応Hot Soup Processor ver.3.0 以上 IE7以上
種別HSPモジュール

必須モジュール

 別途バイナリ解析モジュールが必要です。

zip!zip!

  mod_pngtomask.zip

mod_pngtomask.hsp

//imgload HSPサンプルスクリプトより抜粋(位置指定Ver)
#ifndef __mod_img__
#define __mod_img__

#module "mod_imgctx"

#define IID_IImgCtx   "{3050f3d7-98b5-11cf-bb82-00aa00bdce0b}"
#define CLSID_IImgCtx "{3050f3d6-98b5-11cf-bb82-00aa00bdce0b}"

#usecom  ImgCtx IID_IImgCtx CLSID_IImgCtx
#comfunc IImgCtx_Load 3 wstr,int
#comfunc IImgCtx_GetStateInfo 8 var,var,int
#comfunc IImgCtx_StretchBlt 12 int,int,int,int,int,int,int,int,int,int

#deffunc imgload str _p1

	;
	;	ImgCtxを利用して画像ファイルを読み込みます
	;	imgload "ファイル名"
	;	(BMP,JPEG,GIF,ICO,PNGフォーマットを読み込み可能)
	;
	fname=_p1
	fpath=getpath( fname,32 )
	if fpath="" : fname = dir_cur + "\\" + fname
	;
	newcom pImage,ImgCtx
	IImgCtx_Load pImage,fname,0

	dim size,4
	repeat
		IImgCtx_GetStateInfo pImage,flg,size,1
		if ( flg & 0x00200000 )==0 : break
		wait 4
	loop

	IImgCtx_GetStateInfo pImage,flg,size,0
	IImgCtx_StretchBlt pImage,hdc,ginfo_cx,ginfo_cy,size(0),size(1),0,0,size(0),size(1),0xCC0020
	redraw 1

	delcom pImage
	return

#global

#endif




//mod_pngtomask
#include "mod_binary.hsp"

#module
#uselib "gdi32.dll"
#cfunc GetPixel "GetPixel" sptr,sptr,sptr
#func SetPixel "SetPixel" sptr,sptr,sptr,sptr
#define ctype pngtomask_crgb(%1, %2, %3)			(%1|(%2<<8)|(%3<<16))

#deffunc pngtomask str _PngFile, int _hspwinid, var _width, var _height, local l1, local l2, local xcnt, local ycnt, local px, local py, local lgsel
binaryload _PngFile, bin, 128        //先頭部分のみバイナリファイルの読み込み
if binaryget(bin,"",0,8,2) != "89504E470D0A1A0A" : return 1		//PNGファイルではない
_width = binaryget(bin,"49 48 44 52",0,4,1)		//画像の横の長さ
_height = binaryget(bin,"49 48 44 52",-1,4,1)	//画像の縦の長さ

lgsel = ginfo_sel
buffer _hspwinid, _width*2, _height
color : boxf 0, 0, _width, _height
imgload _PngFile
color 255: boxf _width, 0, _width*2, _height
pos _width, 0 : imgload _PngFile
l1 = GetPixel(hdc, 0, 0), 0
for ycnt, 0, _height, 1
	for xcnt, 0, _width, 1
		l1 = GetPixel(hdc, xcnt, ycnt)
		l2 = GetPixel(hdc, xcnt+_width, ycnt)
		l1 = peek(l1, 0)
		l2 = peek(l2, 0)
		l1 = (abs(l1 - l2)^255)
		l1 = pngtomask_crgb (l1, l1, l1)
		SetPixel hdc, xcnt+_width, ycnt, l1
	next
next
pos 0, 0
redraw 1
gsel lgsel
return
#global

//SAMPLE
#if 1
pngtomask "a.png", 1, px, py
randomize
repeat
	x = rnd(640)-px/2
	y = rnd(480)-py/2
	repeat 1
		gmode 7, px, py
		pos x , y : gcopy 1
		wait 10
	loop
loop
stop
#endif

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

2005-2011 Akicansoft.