tbasic forum

掲示板 => Tiny Basic for Windows => スレッド開設者: ShionAmasato より 2020年 2月 16日 , 午後 07:58:50

スレッド名: loadpictureでゴミが表示される
投稿者: ShionAmasato より 2020年 2月 16日 , 午後 07:58:50
画像を連結するツールを作ったのですが、2枚目のloadpictureでゴミが表示されます。
(添付画像はツールで連結した画像をjpg変換したものです、右下に余計なものが表示されています)

ソースコードは添付した通りです
スレッド名: Re:loadpictureでゴミが表示される
投稿者: ShionAmasato より 2020年 2月 16日 , 午後 08:00:55
画像がない?
スレッド名: Re:loadpictureでゴミが表示される
投稿者: ShionAmasato より 2020年 2月 16日 , 午後 08:08:36
CLS

PUBLIC FN$
PUBLIC CW
PUBLIC CH
CWPOSITION(16,256)
CSCREEN(160,288)
FOR I=1 TO 8
   CBUTTON(I) ON
   CBUTTON(I).TOP=I*32-16
   CBUTTON(I).LEFT=16
   CBUTTON(I).WIDTH=128
   CBUTTON(I).HEIGHT=32
NEXT
CBUTTON(1).TEXT="ファイルを開く"
CBUTTON(2).TEXT="保存"
CBUTTON(3).TEXT="モザイク"
CBUTTON(4).TEXT="拡大"
CBUTTON(5).TEXT="縦連結"
CBUTTON(6) OFF '未実装
CBUTTON(7) OFF '未実装
CBUTTON(8 ).TEXT="終了"

CHDIR GETPROGRAMDIR
DO
   IF CBUTTON(1).CLICK THEN LOADFILE
   IF LEN(FN$)>0 THEN
      IF CBUTTON(2).CLICK THEN SAVEFILE
      IF CBUTTON(3).CLICK THEN MOZAIKU
      IF CBUTTON(4).CLICK THEN RESIZE
      IF CBUTTON(5).CLICK THEN JOINH
   ENDIF
   IF CBUTTON(8 ).CLICK THEN EXIT DO
LOOP

CLOSECSCREEN
END

SUB LOADFILE
   DIM T$
   T$=SELECTOPENFILE(" |*.JPG;*.PNG;")
   IF LEN(T$)>0 THEN
      FN$=""+T$
   ELSE
      EXIT SUB
   ENDIF
   T$=GETIMAGESIZE$(FN$):CW=VAL(LEFT$(T$,4)):CH=VAL(RIGHT$(T$,4))
   GWPOSITION(256,256)
   GSCREEN(2048,2048)
   GFLOCATE(0,0)
   LOADPICTURE(FN$)
END SUB

SUB SAVEFILE
   FN$=LEFT$(FN$,INSTR(1,FN$,".")-1)+"_EX.PNG"
   SAVEPICTURE(FN$,CW,CH)
   ?FN$+"に保存しました"
END SUB

(中略)

SUB JOINH
   DIM W,H
   DIM F$,T$
   F$=SELECTOPENFILE(" |*.JPG;*.PNG;")
   IF LEN(F$)<1 THEN EXIT SUB
   ?"連結処理中…"
   T$=GETIMAGESIZE$(F$):W=VAL(LEFT$(T$,4)):H=VAL(RIGHT$(T$,4))
   GFLOCATE(-MAX((CW-W)\2,0),-CH)
   LOADPICTURE(F$)
   CH=MIN(CH+H,2048)
   ?"連結完了"
END SUB
スレッド名: Re:loadpictureでゴミが表示される
投稿者: ShionAmasato より 2020年 2月 16日 , 午後 08:28:00
すいません、自己解決しました
   GFLOCATE(-MAX((CW-W)\2,0),-CH)
   LOADPICTURE(F$)
ではなく
   GLOCATE(MAX((CW-W)\2,0),CH)
   LOADPICTURE(F$,W,H)
にすると求めていた挙動をします。

数値がマイナスなのを訝るべきでした…
スレッド名: Re:loadpictureでゴミが表示される
投稿者: ShionAmasato より 2020年 2月 16日 , 午後 08:34:14
話題とは別なのですが

この掲示板について気になるところ
・スパムがついているので消した方がよさそう
・ファイル添付機能があるのに添付したファイルが見れないのはどういうことでしょうか?
スレッド名: Re:loadpictureでゴミが表示される
投稿者: ShionAmasato より 2020年 2月 16日 , 午後 08:57:58
『loadpictureでゴミが表示される』挙動自体はバグの疑いがあるので簡潔に再現コードを書いておきます(仕様としては不可解)

   GSCREEN(999,999)
   GLOCATE(0,0):LOADPICTURE("幅400画像.png")
   GLOCATE(0,240):LOADPICTURE("幅300画像.png")

このように1枚目より2枚目の幅が小さいとき、幅の差分だけ1枚目の画像が表示されます

tbasicのversionは1.50です
スレッド名: Re:loadpictureでゴミが表示される
投稿者: takeuchi より 2020年 2月 17日 , 午後 02:05:40
ShionAmasatoさん
 こんにちは,

>ソースコードは添付した通りです

 tbasic の中ではかなり難しい命令等を使ったプログラムで
 興味深く,読ませていただきました。

> すいません、自己解決しました

 良かったです。

>この掲示板について気になるところ

 ご指摘ありがとうございます。

>・スパムがついているので消した方がよさそう

 はい,その通りです。削除します。
 この掲示板はなるべく自由に投稿してもらいたいとの考えから,初めての投稿には特に制限は
かけていません。そのため,実はスパムは膨大に投稿されています。一度スパムが投稿されると
投稿の削除,ユーザー,IPへの投稿制限等をかけていますが,異なる名前やIPでの投稿は後をたちません。
 それでもその効果があったのか,最近は随分と減っています。


>ファイル添付機能があるのに添付したファイルが見れないのはどういうことでしょうか?

 ログインすると見える筈ですが,いかがでしょうか。

>『loadpictureでゴミが表示される』挙動自体はバグの疑いがあるので
> 簡潔に再現コードを書いておきます(仕様としては不可解)

 有難うございます。もしかして外しているかもしれませんが,LoadPictureの仕様を少し説明します。

LoadPictureは現在開いているScreenに当該の画像をLoadします。グラフを書くときの,
Line, PSet などと同じです。ですから,画面に何か描かれていると,前の画像が残る可能性があります。
それを消したい場合は,Cls 2 を使うか,当該範囲をBackColorでPaint 等で塗りつぶすことが考えられます。

GScreen は何度でもサイズ等を設定し新たに開くことができますので,画像をLoadする場合は,
GetImageSize で大きさを決めてScreen を設定するか,もしくは
GScreen (x,y,x1,y1)型のScreenの開き方を使って GStretch や,GScroll で処理する方法も考えられます。

参考になればよいのですが。
スレッド名: Re:loadpictureでゴミが表示される
投稿者: ShionAmasato より 2020年 2月 17日 , 午後 04:14:31
一度グラフをCLSするというのはちょっと頭になかったので追試してみたのですが
『CLS 2』で画面が真っ白になったあとに、残骸付きの画像が読み込まれるというかなり怪しい挙動なんです…
(CLS 2の後にSLEEPで2秒空けて確認しました)

添付画像の件ですが、ShionAmasatoでログイン状態にもかかわらず見えません。そちらからは見えてるのでしょうか?
(「投稿内容を編集」ではファイルの存在が確認できました。ただ画面上に画像が出ません)
スレッド名: Re:loadpictureでゴミが表示される
投稿者: takeuchi より 2020年 2月 18日 , 午後 05:34:30
ShionAmasatoさん

> 一度グラフをCLSするというのはちょっと頭になかったので追試してみたのですが
>『CLS 2』で画面が真っ白になったあとに、残骸付きの画像が読み込まれるというかなり怪しい挙動なんです…
>(CLS 2の後にSLEEPで2秒空けて確認しました)

確かに変です。確認しました。バグでした。ご指摘ありがとうございました。

早速修正しました。それを

http://www.tbasic.org/downloads/TBasic1501.zip

に置きました。お試しください。

>添付画像の件ですが、ShionAmasatoでログイン状態にもかかわらず見えません。そちらからは見えてるのでしょうか?
>(「投稿内容を編集」ではファイルの存在が確認できました。ただ画面上に画像が出ません)

私からはファイルの存在も見えますし,掲示板画面で画像が普通に表示されます。
掲示板設定では特に特別な設定をしていないので,
ログインすれば見えると思っていたのですが。何か別の問題があるかもしれません。
掲示板の設定をもう一度確認してみます。

ありがとうございました。
スレッド名: Re:loadpictureでゴミが表示される
投稿者: ShionAmasato より 2020年 2月 20日 , 午後 02:44:50
1501を試しました。
今度は余計な部分がつかずに表示できました。

修正ありがとうございます。
スレッド名: Re:loadpictureでゴミが表示される
投稿者: ShionAmasato より 2020年 2月 20日 , 午後 08:39:30
グラフ画面でもう一つ気になっていたのですが、LINE命令で色番号を省くとB,BFが指定できない(変数名と解釈される?)
のですが、0~15番で指定できない色を塗りつぶし四角を一気に描くことはできないのでしょうか

FOR-NEXTとPSETを組み合わせると処理時間が掛かりそうで…

添付画像はテストプログラムです
スレッド名: Re:loadpictureでゴミが表示される
投稿者: takeuchi より 2020年 2月 21日 , 午後 01:34:15
>グラフ画面でもう一つ気になっていたのですが、LINE命令で色番号を省くとB,BFが指定できない(変数名と解釈される?)
>のですが、0~15番で指定できない色を塗りつぶし四角を一気に描くことはできないのでしょうか

 GForeColor で前景色を指定する場合の,ヘルプでの「Lineのカラー指定を省略する説明」が少しわかりにくいかもしれません。
少し捕捉します。

Line(140,140)-(180,180),9,B

でのカラー番号の省略は

Line(140,140)-(180,180),B

ではなく,

Line(140,140)-(180,180),,B

です。ですから目的のプログラムは

GScreen(600,600)
Line(40,40)-(80,80),9
Line(140,140)-(180,180),9,B
Line(240,240)-(280,280),9,BF
GForeColor="#905030":Line(40,40+300)-(80,80+300)
GForeColor="#905030":Line(140,140+300)-(180,180+300),,B
GForeColor="#905030":Line(240,240+300)-(280,280+300),,BF

となります。お試しください。

スレッド名: Re:loadpictureでゴミが表示される
投稿者: ShionAmasato より 2020年 2月 21日 , 午後 03:19:44
なるほど、コンマの数は変わらず、値だけ省くのですね。

これで目的の機能は一通り実装できそうです。
ありがとうございました。
スレッド名: Re:loadpictureでゴミが表示される
投稿者: ShionAmasato より 2020年 2月 23日 , 午後 06:43:09
用が済みましたのではてなフォトライフに仮アップした画像を削除しました。
あわせてスレッドのロックもかけておきます。