4D v13」タグアーカイブ

2つの画像を比較する

今回は画像サイズの話。フォームに表示した画像変数がコピペやドラッグ&ドロップで変更された場合をキャッチしようとしていました。
On Data Changeを使うと同じ画像をペーストされた場合を識別できません。
リファレンスにEqual picturesというコマンドがありました。これだと思って使ってみるとうまく動いてくれません。
単純化して調べてみると、同じ画像を代入した2つのピクチャー変数を比較するとFalseが返ってくるのです。同じ画像を代入したのに等しくないと。マニュアルが間違っていて戻り値が逆?、変数の領域が異なる?とか、いろいろ考えてはまりました。
どうやら画像が空の場合にFalseになるのだと気づきました。そこでサイズを調べてみたら、サイズがゼロの時にEqual picturesはいつもFalseを返す、のでした。

//関数名:BL03_PIC_load
//20150206 wat
//画像をロードしてフォームに表示、途中で変更されたかどうかを調べようと、
// 4D v13で実装されたEqual picturesを使ってみる。

C_LONGINT($1;$pic_id)
$pic_id:=$1

C_PICTURE($mask)
C_BOOLEAN($isEqual)
C_TEXT($m)

READ ONLY([PIC_SET])
QUERY([PIC_SET];[PIC_SET]PIC_ID=$pic_id)
$numOfRecs:=Records in selection([PIC_SET])
If ($numOfRecs=1)

//同じ画像フィールドから2つの変数にピクチャーをロード
vBL03_varPIC_LOGO:=[PIC_SET]PIC_LOGO
vBL03_varPIC_LOGO_onload:=[PIC_SET]PIC_LOGO

//画像を比較すると
$isEqual:=Equal pictures(vBL03_varPIC_HEAD;vBL03_varPIC_HEAD_onload;$mask)
$m:=$m+”PIC_HEAD $isEqual=”+String($isEqual)+”,”
ALERT($m)
// Falseが返ってくることがある????  そこでサイズを調べてみた

C_LONGINT($picSize;$picSize_onload)

$picSize:=Picture size(vBL03_varPIC_HEAD)
$picSize_onload:=Picture size(vBL03_varPIC_HEAD_onload)
$isEqual:=Equal pictures(vBL03_varPIC_HEAD;vBL03_varPIC_HEAD_onload;$mask)

$m:=”BL03_PIC_load: ”
$m:=$m+”PIC_HEAD $isEqual=”+String($isEqual)+”,”
$m:=$m+” $picSize=[“+String($picSize)+”]”
$m:=$m+” $picSize_onload=[“+String($picSize_onload)+”]”
ALERT($m)

End if

リファレンスをよく読んでみたら書いてありました。Equal picturesは空のピクチャを与えると正しく実行されなかったとしてシステム変数OKにゼロを返す、と。要はEqual picturesは正しく実行されたかどうかを判定してから比較結果を評価しなくてはならないのでした。
ここで2者択一問題が発生しました。

1)OK変数が1の時だけ比較値を評価する
2)画像サイズがゼロの時はそもそもEqual picturesを実行しない

さてどちらでしょうか。サイズがゼロ以外にOK変数がゼロになることがあるのでしょうか?

「サイズがゼロでもゼロ以外でもEqual picturesがエラーの場合、アプリは画像は変化しなかったと見なす」

として問題は無いように思えます。いやもとい、片方の画像サイズがゼロでもう片方がゼロじゃなかったらエラーになる、という意味でしょうから

今回は次のコードを正解としました。

//Jiro_pic_isEqual
//20150207 wat
//2つの画像を比較して同じかどうかを調べる

C_PICTURE($1;$pic1)
$pic1:=$1
C_PICTURE($2;$pic2)
$pic2:=$2

C_PICTURE($mask)
C_LONGINT($pic1Size;$pic2Size)
C_BOOLEAN($0;$isEqual)

$isEqual:=Equal pictures($pic1;$pic2;$mask)
If (OK=0)

// OK変数の値がゼロの場合はサイズがゼロの可能性がある
//どちらか一方だけがゼロの場合:OK変数がゼロ、比較結果はFalse
//または両方ゼロじゃない場合:OK変数が1、比較結果は画像が同じならTrue画像が違えばFalse

//失敗の場合、画像サイズが同じゼロならツゥルー
$pic1Size:=Picture size($pic1)
$pic2Size:=Picture size($pic2)
If (($pic1Size=0)&($pic2Size=0))

$isEqual:=True

Else

//現時点では失敗の場合フォルスが返されているが念のため
$isEqual:=False

End if

End if

$0:=$isEqual