テキストファイルか画像ファイルかの判定

解決


へそ  2003-03-19 22:39:04  No: 3173

初心者ですがビューアーを作ろうと思っています。
TForm1.FormCreateのところでコマンドラインから取得した
ファイルをテキストファイルか画像ファイルか判断したいのですが
どのように記述すればいいのでしょうか?

implementation

{$R *.dfm}
procedure TForm1.ShowText;
var
  Memo1: TMemo;
begin
  Memo1:= TMemo.Create(Self);
  Memo1.Parent := Self;
  Memo1.Align := alClient;
  Memo1.Lines.LoadFromFile(ParamStr(1));
end;

procedure TForm1.ShowImage;
var
  Image1: TImage;
begin
  Image1:= TImage.Create(Self);
  Image1.Parent := Self;
  Image1.Align := alClient;
  Image1.Picture.LoadFromFile(ParamStr(1));
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  if ParamCount > 0 then
    「テキストならShowTextへ」
    「画像ならShowImageへ」
  end;
end;

end.


にしの  2003-03-19 23:15:04  No: 3174

画像ファイルとテキストどちらも判断したいのですか?
そうすると、どちらでも無い場合の処理も必要ですよ。

テキストファイルの判断は、テキストのみで構成されているかをファイルの内容全て読んで判断します。簡単に判断させたいなら、ファイル中に #0(ヌル文字)があるかを判断し、なければテキストと見なします。

画像ファイルと言っても幅広く、判断しにくいのですが、画像データとして正しいデータなら、画像と見なします。簡単に判断するだけの場合、ヘッダが正しければ画像と見なします。

画像ビューアがメインなら、Susieプラグインを使って画像かどうかを判断し、全てのプラグインで判断できなかったらテキストとして表示してみる、というのがよいかと思います。

http://home1.infonia.ne.jp/~delphian/delphi/
ここにSusieプラグインを扱うコンポーネントがあります。
また、Susieのサイトは、
http://www.digitalpad.co.jp/~takechin/
です。C用ですが、SDKもあります。


たかみちえ  URL  2003-03-19 23:47:12  No: 3175

> ファイル中に?#0(ヌル文字)があるかを判断し
  それだと、Macのシンプルテキスト用書式情報が入ったものが、
テキストとみなされませんね。
ヘッダさえ取り除けば、ただのテキストなのに。

  わたしは、どこかで誰かが紹介していた方法ですけど、
"先頭数十バイトを見て、中にタブか改行以外のコントロールコード(文字じゃないコード)が、6個以上あればテキストではない"
と判断する方法を使ってみたらいいとおもいます。
  テキストじゃないものをTMemoとかに表示しても、
別にエラーは起こらないはずですからねぇ…。

  がぞうファイルは…。
とりあえず読み込んでみて、エラーが起こったら画像じゃない(またはサポートされてない画像)とするのはどうでしょう?

  あとはいちおう、ファイルの正しい拡張子を判断するDLLというのもあるそうですが。

  どっちか早く済む(またはよくある)とおもうほうを先に判断しておくと、
処理時間が短くなりやすくなるとおもいますよ。


にしの  2003-03-20 01:45:17  No: 3176

>   それだと、Macのシンプルテキスト用書式情報が入ったものが、
> テキストとみなされませんね。
Delphiのコンポーネントで、MacヘッダつきのBMPやJPEGも読み込めないと思います。同じ処理と言うことでよいのでは?
テキストの判断に必要ならば、画像のほうにもその処理が必要ですね。


へそ  2003-03-20 02:00:12  No: 3177

にしのさん、たかみちえさん、ありがとうございます。
仮に、最初画像ファイルとして読み込むとすると、先に
TImageを生成しておかないとだめなんですよね。私は
あるファイルを読み込んだ時に、そのファイルがテキストか
画像か調べる関数みたいなものがあれば、その後、動的に
TMemoかTImageのコンポーネントを生成しようとしていました。
お二人の意見を参考にしてみると、先に画像ファイルとして
読み込んでエラーが出ればとりあえずテキスト表示みたいな
ほうが私的にはなんとか作れそうです。


たかみちえ  URL  2003-03-20 07:08:00  No: 3178

> Delphiのコンポーネントで、MacヘッダつきのBMPやJPEGも読み込めないと思います。
  いえいえそういうことではないです。
Macで作った画像ファイルなどは(むこうでしかるべき処置をすれば?)、Windowsのどのソフトでも普通に読み込むことができます。

  ただ、それ(マックバイナリとか)とは別に、シンプルテキストは、その書式情報を、
ヌル文字を含んだヘッダとして書き込むのです。
(以前Macユーザーの友達から、そういうファイルが送られてきました)
それをちゃんと取り除いてやれば、Windowsのメモ帳でも、ちゃんとテキストファイルとして読めるんです。
  TeraPadやK2Editor(該当文字を空白に置き換えて表示する機能を持ったエディタ)で読めたので、そういうことで間違いないかと。
  ちょっと特殊な状況ですけど、
対応しておいて損はないとおもいますから。

> TImageを生成しておかないとだめなんですよね。
  TImageは"どうやって"画像を表示しているんでしょうか?
画像を保存するオブジェクトを作るだけなら、関数内で生成しても問題ないでしょう。

  それから、おせっかいとおもいますけど、
表示に使うVCLは、あらかじめ生成しておくといいとおもいますよ。
  そのビューアを再使用する(起動させたままもう一回別のファイルを表示する)とき、どっちにしろ面倒なことになりますよね。
  それと、テキストファイルを見るだけなら、TMemoはいりませんね。
DrawTextEx APIを使えば、複数行テキストを描画することができますから。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加