Tips

フィールドに保存されたPICT形式の画像

日付2017/08/29
ID17-001
バージョン16
プラットフォームWin, Mac

4D 64bit版では、以前よりアナウンスされていましたように、PICT形式の画像を扱うことができなくなります。その技術的背景は、過去のTip記事「PICT画像をPNG画像へと変換するユーティリティ」にて説明しているので、本記事では省かせていただきます。

Windows環境では、4D(スタンドアローン/クライアント)の32bitでの利用になりますので、現行のバージョンでPICT形式の画像を利用できているかと思います。将来64bitに移行することを考えると、4D v16を利用している間に、PICT形式の画像を別の形式に変換することを検討することをお勧めします。既にmacOSでは、4D v16から4Dの全てで64bit版が利用可能ですが、PICT形式の画像がデータに存在しているために、運用で32bitを選択されているかもしれません。

ストラクチャにあるPICT形式の画像については、既に多くのデベロッパーが排除されてご利用のことと思いますが、過去にフィールドに保存されていたPICTを一括して変換する機会として、最も適した環境は4D v16になります。4D v16を利用中に、データとして利用されているPICT形式の画像を一括変換しておくことをお勧めします。

4D v16での変換が、PICT形式の画像を一括変換するのに最も適しているバージョンである理由として…

…が、あります。

一括変換メソッド

具体的なコードをご紹介します。このコードは、4D v16に特化したコードですので、他のバージョンで動作させるためには、ここまま使うことができないかもしれません。

サンプルのC4Dファイルは、下記リンクよりダウンロードできます。

C4Dファイルの使い方は、デザインリファレンスを参照してください。

このサンプルでは、全てのテーブルに保存されたピクチャデータを調べ、PICT形式であった場合にPNG形式に変換して保存します。クライアント/サーバー環境で4D Serverが64bit版である場合には、32bit版の4Dでリモート接続し、クライアント側で実行することで利用可能です。

参考までに、サンプルC4Dファイルの内容を掲載しておきます。

ASSERT(Not(Version type ?? 1);"32ビット版の4Dでのみ動作します")
ASSERT(Not(Num(Substring(Application version;1;2))<16);"4D v16より前のバージョンで動作させる場合には、GET PICTURE FORMATSは使えません")

  //目的
  //PICTをPNGに変換
  //for 4D v16向け
  //4D v15以前で利用する場合には、GET PICTURE FORMATSを使わないようにコードを書き換える

C_POINTER($pt_Tarble;$pt_Field)
C_LONGINT($i_table;$i_field;$i_fieldType)
C_LONGINT($i;$i_len;$ref1)
C_LONGINT($i_RecordPos;$i_RecordNum)
C_BOOLEAN($b_include_PICT)

ARRAY TEXT($codecIDs;0)

C_LONGINT($i_Count_PICT)
$i_Count_PICT:=0

$ref1:=Progress New 
$ref2:=Progress New 

For ($i_table;1;Get last table number)  //全てのテーブルを調べる
	
	Progress SET PROGRESS ($ref1;$i_table/(Get last table number+1);"Table: "+String($i_table)+"/"+String(Get last table number))
	
	If (Is table number valid($i_table))  //テーブル番号は有効か?
		  //全てのレコードを処理する
		$pt_Tarble:=Table($i_table)
		ALL RECORDS($pt_Tarble->)
		$i_RecordNum:=Records in selection($pt_Tarble->)
		For ($i_RecordPos;1;$i_RecordNum)
			
			Progress SET PROGRESS ($ref2;$i_RecordPos/($i_RecordNum+1);"Record: "+String($i_RecordPos)+"/"+String($i_RecordNum))
			
			$b_include_PICT:=False  //PICTフラグを初期化
			
			For ($i_field;1;Get last field number($i_table))  //全てのフィールドを調べる
				If (Is field number valid($i_table;$i_field))  //フィールド番号は有効か?
					$pt_Field:=Field($i_table;$i_field)
					GET FIELD PROPERTIES($pt_Field;$i_fieldType)
					If ($i_fieldType=Is picture)  //フィールドのタイプを調べてピクチャフィールドなら画像をチェックする
						GET PICTURE FORMATS($pt_Field->;$codecIDs)
						If (Find in array($codecIDs;".pict")>0)  //ピクチャーのコーデックを調べてPICTなら変換する
							$i_Count_PICT:=$i_Count_PICT+1
							CONVERT PICTURE($pt_Field->;".PNG")  // to png
							GET PICTURE FORMATS($pt_Field->;$codecIDs)
							If (Find in array($codecIDs;".pict")>0)
								ALERT("変換失敗")  //ログをファイル等に書き出すように工夫することをお勧めします
							End if 
							$b_include_PICT:=True
						End if 
						
					End if 
				End if 
			End for 
			
			If ($b_include_PICT)
				  //修正したレコードを保存
				SAVE RECORD($pt_Tarble->)
			End if 
			
			NEXT RECORD($pt_Tarble->)  //次のレコードの検査
		End for 
	End if 
End for 

Progress QUIT (0)

  //以下のコードは結果をアラートで表示します
  //ログをファイル等に書き出すように工夫することをお勧めします

If ($i_Count_PICT=0)
	ALERT("処理を終了しました。\rPICTは、ありませんでした。")
Else 
	ALERT("処理を終了しました。\rPICTは、全部で "+String($i_Count_PICT)+" 個ありました。")
End if