Tips

PICT画像をPNG画像へと変換するユーティリティ

日付2017/05/09
ID76775 (英語原文参照)
バージョンv13以降
プラットフォームWin, Mac

古いデータベース(v13以前で作成されたデータベース)をアップグレードする必要があるデベロッパーにとって、その古いデータベースのピクチャーライブラリ内、あるいは外部から読み込まれた画像の中にPICTフォーマットで保存されている画像が残っている可能性というのは高いといえるでしょう。

PICTとは初期のApple Macintoshコンピューターで標準フォーマットとして導入された、QuickDrawフレームワークによってレンダリングされる画像のグラフィックファイルフォーマットです。Macアプリケーション間での画像(ビットマップとヴェクターの両方)の交換をサポートし、それに加えて限定的ながらテキストもサポートしていました。

AppleがOSXオペレーションシステムを現代化させたことにより、QuickDrawフレームワークは使用されなくなりました。PICTグラフィックフォーマットはネイティブのグラフィックフォーマットとしては使用されなくなったのです。これに変わり、Macのネイティブフォーマットとしては今はPortable Network Graphics(PNG)が使用されます。4Dではv12を最後に、QuickDrawフレームワークは使用されなくなりました。

v13へとアップグレードする前に、データベース内で使用されている全ての画像を一つ一つ調べて、PICTフォーマットの画像を変換していくというのは容易な作業ではありません。データベースのv13への移行を補助するために、新しいコマンド"AP Is Picture Deprecated" が4D Packプラグインに追加されました。

以下は、実装・実行することでデータベースのピクチャーライブラリ内にある全てのPICTをPNGへと変換するユーティリティメソッドです。

If (True)
	If (False)
		Begin SQL
			    /*
			    Name: UTIL_ConvertPICTs
			    Path: UTIL_ConvertPICTs
			
			    Purpose: Convert all PICT formatted images in the 
			    Picture Libraray to .PNG images
			
			    The v13.2 or later 4D Pack Plugin must be installed to use this method
			
			    */
		End SQL
	End if 
	C_TEXT($MethodName_T)
	$MethodName_T:=Current method name
	  //===================== Declare Variables ==================================
	  //method_parameters_declarations
	  //--------------------------------------------------------------------------------
	  //method_wide_constants_declarations
	  //--------------------------------------------------------------------------------
	  //local_variable_declarations
	C_LONGINT($Ndx;$SOA;$RIS;$PictRef_L)
	C_TEXT($PictName_T)
	C_PICTURE($Pict_G)
	C_POINTER($Pict_P)
End if 
  //====================== Initialize and Setup ================================

ARRAY LONGINT($PictRef_aL;0)
ARRAY TEXT($PictName_aT;0)

PICTURE LIBRARY LIST($PictRef_aL;$PictName_aT)
$SOA:=Size of array($PictRef_aL)

  //======================== Method Actions ==================================

If ($SOA>0)
	For ($Ndx;1;$SOA)  // for each picture
		$PictRef_L:=$PictRef_aL{$Ndx}
		$PictName_T:=$PictName_aT{$Ndx}
		GET PICTURE FROM LIBRARY($PictRef_aL{$Ndx};$Pict_G)
		$Pict_P:=->$Pict_G  // passage of a pointer
		If (AP Is Picture Deprecated($Pict_P)=1)  // if format is obsolete
			CONVERT PICTURE($Pict_G;".PNG")  // conversion to png
			SET PICTURE TO LIBRARY($Pict_G;$PictRef_L;$PictName_T)  // and storage in the library
		End if 
	End for 
Else 
	ALERT("The picture library is empty.")
End if 

  //======================== Clean up and Exit =================================

日本語チームによる注釈1

4D v16で、GET PICTURE FORMATSコマンドが追加されました。4D v16以降であれば、GET PICTURE FORMATSを利用して4D Packプラグイン無しでPICT形式かどうかを判定できます。

具体的には上記サンプル中のIf文でAP Is Picture Deprecatedコマンドを利用している箇所を下記のように書き換えます。

 //$Pict_P:=->$Pict_G  // passage of a pointer
 //If (AP Is Picture Deprecated($Pict_P)=1)  // if format is obsolete
 //CONVERT PICTURE($Pict_G;".PNG")  // conversion to png
 //SET PICTURE TO LIBRARY($Pict_G;$PictRef_L;$PictName_T)  // and storage in the library
 //End if 
GET PICTURE FORMATS($Pict_G;$codecIDs)
If (Find in array($codecIDs;".pict")>0)  //ピクチャーのコーデックを調べてPICTなら変換する
	CONVERT PICTURE($Pict_G;".PNG")  // conversion to png
	SET PICTURE TO LIBRARY($Pict_G;$PictRef_L;$PictName_T)  // and storage in the library
End if 

なおPICT変換は、64ビットでは行なえませんので、必ず32ビット版の4Dをお使いください。

日本語チームによる注釈2

マイナス番号のIDを持つライブラリピクチャーは、コマンドで取り扱うことができません。そこでメソッドで処理するにあたり、前準備が必要です。

この前準備は、マイナス番号のIDを正の数のライブラリーピクチャーに書き換えることが目的です。

このようにして、すべてのマイナス番号のライブラリピクチャーが無くなったことが確認できましたら、メソッドによるPICT変換の作業を行います。

なお、検索結果を利用した文字列の置換機能につきましては、デザインリファレンスをご参照ください

資料:デザインリファレンス・文字列置換