http://hsp.tv/play/pforum.php?mode=all&num=84469
色変換した画像を、32bitPNGで保存しようとしているのですが、
画像保存後、ソフトの挙動がおかしくなります。
バーを移動させて、変更ボタンを押したら色変更が出来なくなったり、
同じ画像が何枚も重なって表示されているような挙動をしたり…
実は違うソースで似た処理を作っていたのですが、やっぱり保存後に挙動がおかしくなるので、
もうちょっと簡略化したソースで以下のようなものを作り試したのですが、やはり正常に動きません。
(一部に http://hsp.tv/play/pforum.php?mode=pastwch&num=42279 での、
#include "a2d.hsp" #include "llmod3.hsp" #include "trackbox.hsp" #pack "trackbox.hsp" :#pack "llmod3.hsp" #pack "a2d.hsp" #packopt name "カラーチェンジャーセーブテスト" ddim cmatrix_bak,20 #module "_huematrix_" //0から1の間の値に変換 //-0.2は0.8。1.2は0.2とする。 #defcfunc normalize double x,local x2 x2 = x x2 -= int(x) if(x2 < 0f){x2 += 1.0} return(x2) //6通りの色相変換 //xは色相。0〜1で一周する。 #deffunc gethue1 double x,array arr,local x2,local hi,local f1,local f2,local m0,local m1,local m2 x2 = normalize(x) hi = int(x2 * 6.0) f2 = x2 * 6.0 - hi f1 = 1.0 - f2 if(hi == 0) {m0 = 1f:m1 = f2:m2 = 0f} else:if(hi == 1) {m0 = f1:m1 = 1f:m2 = 0f} else:if(hi == 2) {m0 = 0f:m1 = 1f:m2 = f2} else:if(hi == 3) {m0 = 0f:m1 = f1:m2 = 1f} else:if(hi == 4) {m0 = f2:m1 = 0f:m2 = 1f} else:if(hi == 5) {m0 = 1f:m1 = 0f:m2 = f1} ddim arr, 20 arr = m0,m1,m2,0f,0f,m2,m0,m1,0f,0f,m1,m2,m0,0f,0f,0f,0f,0f,1f return //6通りの色相変換(hsvcolor) //色相の分解能が192しかない #deffunc gethue2 double x,array arr,local bmscr,local col,local m0,local m1,local m2 mref bmscr, 67 col = bmscr(40) ;色を保存 hsvcolor 192f * x, 255, 255 m0 = double(ginfo_r) / 255f m1 = double(ginfo_g) / 255f m2 = double(ginfo_b) / 255f ddim arr, 20 arr = m0,m1,m2,0f,0f,m2,m0,m1,0f,0f,m1,m2,m0,0f,0f,0f,0f,0f,1f color col>>16,(col>>8)&0xff,col&0xff;色をもとに戻す return //3通りの色相変換 #deffunc gethue3 double x,array arr,local x2,local hi,local f1,local f2,local m0,local m1,local m2 x2 = normalize(x) hi = int(x2 * 3.0) f2 = x2 * 3.0 - hi f1 = 1.0 - f2 if(hi == 0) {m0 = f1:m1 = f2:m2 = 0f} else:if(hi == 1) {m0 = 0f:m1 = f1:m2 = f2} else:if(hi == 2) {m0 = f2:m1 = 0f:m2 = f1} ddim arr, 20 arr = m0,m1,m2,0f,0f,m2,m0,m1,0f,0f,m1,m2,m0,0f,0f,0f,0f,0f,1f return #global screen 0,500,400 m_layer=1 alCreateImage 10,256,256 ;画像をまとめて表示するための仮想スクリーン10を初期化 ; ◆各レイヤー画像を各仮想スクリーンにロード repeat 5 alCreateImage cnt,256,256 alCreateImageByFile cnt, ""+cnt+".png" alCopyImageToImage cnt, 10 ;仮想スクリーン10に画像をまとめる loop alCopyImageToScreen 10,0,100,0 ;仮想スクリーン10から、HSPのスクリーンに画像をコピーし、表示する redraw 1 gsel 0,1 pos 10,300 trackbox 200,25,$100 tb_id.0=stat trackrng 0,1000 ; ↓各レイヤーの切り替えボタン pos 10,10:objmode 0:button "レイヤ0",*layer0 pos 10,50:objmode 0:button "レイヤ1",*layer1 pos 10,90:objmode 0:button "レイヤ2",*layer2 pos 10,130:objmode 0:button "レイヤ3",*layer3 pos 10,170:objmode 0:button "レイヤ4",*layer4 ; 変換ボタン(サンプルコードにあったもの)と、独自で付け加えたカラーリセットボタン pos 120,350:objmode 0:button "変換",*hyouji pos 10,350:objmode 0:button "リセット",*reset ; ↓保存・読み込み用ボタン pos 370,210:objmode 0:button "色保存",*hozon pos 370,250:objmode 0:button "色読込",*yomikomi objsize 80,,0 :pos 370,350:objmode 0:button "PNG保存",*pnghozon stop *hozon ; cmatrixを、cmatrix_backに保存 repeat 20 cmatrix_bak(cnt)=cmatrix(cnt) loop stop *yomikomi loadswitch=1 goto *hyouji *reset ; 画像を再ロードして、色変更されていないものに変更する、実質リセット repeat 5 if m_layer=cnt{ alCreateImage cnt,256,256 alCreateImageByFile cnt, ""+cnt+".png" alResetCopyMode} resetswitch="layerreset" loop goto *hyouji ; ◆現在いじってるレイヤー、を指定ている、変数「m_layer」に、選択したレイヤのナンバーをいれる *layer0 m_layer=0 goto *hyouji *layer1 m_layer=1 goto *hyouji *layer2 m_layer=2 goto *hyouji *layer3 m_layer=3 goto *hyouji *layer4 m_layer=4 goto *hyouji *hyouji dialog resetswitch alCreateImage 10,256,256 ;仮想スクリーン10のリセット ; ◆仮想スクリーンに画像をロード repeat 5 if m_layer=cnt{alCreateImage cnt,256,256 alCreateImageByFile cnt, ""+cnt+".png"} loop sel_trackbox tb_id.0 trackpos 0,1 x = 0.001 * stat gethue3 x, cmatrix ;ロードするよ、というスイッチが入っているときに、cmatrix_bakに保存した中身を読み込みする if loadswitch=1{ repeat 20 cmatrix(cnt)=cmatrix_bak(cnt) loop } ; ◆現在操作しているレイヤー画像のある仮想スクリーンを、カラーマトリクスモードで変更 if resetswitch="off" :alCopyModeColorMatrix cmatrix :alCopyImageToImage m_layer,m_layer alResetCopyMode ; ◆仮想スクリーン10に、各レイヤを統合する repeat 5 alCopyImageToImage cnt, 10 loop ; ◆仮想スクリーン10から、HSPのスクリーンに画像をコピーして表示する alCopyImageToScreen 10,0,100,0 ; ◆各種スイッチのリセット resetswitch="off" loadswitch=0 gsel 0,1 redraw 1 stop *pnghozon dialog "png", 17, "png Image" if stat=1 { astr = refstr if strmid(astr, strlen(astr)-4, 4) != ".png" : astr += ".png" alSelectImage 10 alSaveFile astr, "image/png", } stop
なたでさん制作のソースコードを使わせていただいています)
画像保存を一度選び、保存せずキャンセルしたときは、異常が起きているように見受けられないので、
if stat=1 {のあたりでなにか処理が誤っているのでしょうか… うーん…
astr = refstr if strmid(astr, strlen(astr)-4, 4) != ".png" : astr += ".png" alSelectImage 10 alSaveFile astr, "image/png", }
最近、何度も書き込みをしていて申し訳ないですが、どうかご容赦ください。
お知恵をお貸しいただけると幸いです。
画像を含むソースコードはこちらに置いておきます↓
https://ux.getuploader.com/ry_game/download/20
(savetest.hspが今回私が作ったソースです)