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


HSPTV!掲示板


未解決 解決 停止 削除要請

2018
0605
nonaArtlet2Dで画像をセーブすると、その後全体的に挙動がおかしくなる3解決


nona

リンク

2018/6/5(Tue) 17:08:32|NO.84555

こちらのスレッドで制作したものの続きです↓
http://hsp.tv/play/pforum.php?mode=all&num=84469

色変換した画像を、32bitPNGで保存しようとしているのですが、
画像保存後、ソフトの挙動がおかしくなります。
バーを移動させて、変更ボタンを押したら色変更が出来なくなったり、
同じ画像が何枚も重なって表示されているような挙動をしたり…

実は違うソースで似た処理を作っていたのですが、やっぱり保存後に挙動がおかしくなるので、
もうちょっと簡略化したソースで以下のようなものを作り試したのですが、やはり正常に動きません。


#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
(一部に http://hsp.tv/play/pforum.php?mode=pastwch&num=42279 での、
なたでさん制作のソースコードを使わせていただいています)

画像保存を一度選び、保存せずキャンセルしたときは、異常が起きているように見受けられないので、
	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が今回私が作ったソースです)



この記事に返信する


nona

リンク

2018/6/7(Thu) 05:30:11|NO.84570


#include "a2d.hsp" color 200,200,200 boxf 0,0 pass="test.png" *start objsize 250,,0 pos 100,10:objmode 0:button "仮想スクリーンに画像を読む",*load pos 100,35:objmode 0:button "仮想スクリーンのを再読み込み",*sai_load pos 100,70:objmode 0:button "メインスクリーンに画像を表示",*hyouji pos 100,95:objmode 0:button "メインスクリーンの画像を消去",*kesu pos 100,120:objmode 0:button "仮想スクリーンをPNG保存",*pnghozon stop *load alCreateImageByFile 0,pass goto *start *sai_load alCreateImage 0 alCreateImageByFile 0,pass goto *start *hyouji redraw 0 alCopyImageToScreen 0, 0 redraw 1 goto *start *kesu ;灰色で塗りつぶして消す color 200,200,200 boxf 0,0 goto *start *pnghozon dialog "png", 17, "png Image" if stat=1 { astr = refstr if strmid(astr, strlen(astr)-4, 4) != ".png" : astr += ".png" alSelectImage 0 alSaveFile astr, "image/png", } goto *start
質問するにしても、ゴチャっとしたコードを提示し過ぎた…と反省したので、
もっと簡略化してみました。
test.pngは、いらすとやさんから、透過png画像をお借りして同フォルダ内に置いています。

一度「*pnghozon」のを実行後、
「alCreateImageByFile」で画像ロードをしようとすると、
やはり画像ロードにしっぱいするようで、
alCreateImageByFile 0,pass
dialog stat
とやってみると、statの中身が「-1」…つまり、正常に行われていないのです。

何らかの理由で、変数「pass」の中身がおかしくなって、
でうまくファイル名の指定が入ってないのかとも思ったのですが、
「dialog」命令で
dialog pass

ってやっても、正常に「test.png」って表示されているし… 原因がさっぱりわかりません。 そもそも「*pnghozon」で行っている処理がまるっと間違えているんでしょうか。 もしそうだとしても、画像ロードに失敗する理由がよくわからないのですが…



ogat

リンク

2018/6/7(Thu) 11:15:44|NO.84571

多分ですけどファイルエラーになるのは保存するときのdialogでカレントディレクトリが変わっているからじゃないですか。
ほかにもalSelectImageで変更した操作先を元に戻してないのもよくないかも



nona

リンク

2018/6/7(Thu) 13:14:15|NO.84572

ogatさま、ありがとうございます。
確かに…ファイルの保存先によっては、作業フォルダが変わってしまう結果になりますもんね。
そのことにまったく気づいていませんでした…

現在のディレクトリパスを一度変数に入れたあと、別のフォルダに画像を保存後、
「chdir」命令で上記の変数を指定し、元のディレクトリに戻る…という処理を挟み、
正常に動作させることが出来ました。

本当にありがとうございました!



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