フィールドに保存されたPICT形式の画像
日付 | 2017/08/29 |
---|---|
ID | 17-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には32bit版がありPICT画像を扱える
- GET PICTURE FORMATSコマンドが4D v16で追加された
一括変換メソッド
具体的なコードをご紹介します。このコードは、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