PICT画像をPNG画像へと変換するユーティリティ
| 日付 | 2017/05/09 | 
|---|---|
| ID | 76775 (英語原文参照) | 
| バージョン | 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を正の数のライブラリーピクチャーに書き換えることが目的です。
- まず最初に、マイナス番号のIDのピクチャを正の数のIDのピクチャに変換する
- デザインモードの「検索」メニューから「デザインモードを検索」を選択
- 問題のマイナス番号を検索
- 検索結果のリストから任意のフォームオブジェクトをダブルクリック
- フォームエディタが開きIDがマイナスであるライブラリピクチャーが選択されているのを確認
- プロパティリストでタイプをライブラリピクチャーからスタティックピクチャーに変更
- タイプを再びライブラリピクチャーに戻す注:このとき新しい正の数のIDが割り付けられたコピーされたライブラリーピクチャーが生成される
- 新しいライブラリーピクチャーのIDを控える
 
- マイナスIDの参照を新しいIDに置き換える
- デザインモードの「検索」メニューから「デザインモードを検索」を選択
- 改めて問題のマイナス番号を検索
- 検索結果に関係のないオブジェクトが含まれている場合は関係のないオブジェクトを削除する
- 文字列置換で新しい正の数のIDを指定して置換する
 
- 参照を変換できなかったオブジェクトをチェック(参照に名前が含まれている場合には前述の作業では置換できないので名前を削除してから置換する)
- デザインモードの「検索」メニューから「デザインモードを検索」を選択
- 改めて問題のマイナス番号を検索
- 検索結果のリストから任意のフォームオブジェクトをダブルクリック
- フォームエディタが開きIDがマイナスであるライブラリピクチャーが選択されているのを確認
- プロパティリストで名前/IDの欄にある名前の部分であるスラッシュを含む前の部分の文字列を選択してコピーする
- デザインモードの「検索」メニューから「デザインモードを検索」を選択
- 先程コピーした文字列を検索
- 文字列置換の入力欄を空欄にして置換する(文字列を削除する)
- デザインモードの「検索」メニューから「デザインモードを検索」を選択
- 改めて問題のマイナス番号を検索
- 検索結果に関係のないオブジェクトが含まれている場合は関係のないオブジェクトを削除する
- 文字列置換で新しい正の数のIDを指定して置換する
 
このようにして、すべてのマイナス番号のライブラリピクチャーが無くなったことが確認できましたら、メソッドによるPICT変換の作業を行います。
なお、検索結果を利用した文字列の置換機能につきましては、デザインリファレンスをご参照ください
