お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル

"Delphiで作ったJPEGにコメントを入れる"




{
Delphi3.xのTJPEGImageで保存するファイルにコメントを埋め込みます。
コメントはGVとSUSIEでちゃんと読めます。
変な所があったら添削お願いします。

バイナリを解析した所FFFE****の4バイトがコメントに関する情報を格納し
ている様です。FFFEはコメントヘッダで次の2バイトがコメントの長さ情報
の様です。

コメントの長さはFFFEのあとからコメントの最後のバイトまでを指定する必
要があるので、文字列の長さ+2バイトを指定します。
つまりコメントが4文字ならFFFE0006となります。
長さ情報はWORD値なので、コメントの長さは 65535-2バイトまでだと思いま
す。

この例ではTStrings.Textプロパティを使っています。この場合、最後に必
ずCRLFの改行コード2バイトがつくので、これを考慮してTStrings.Textプロ
パティを使う場合は直接文字列の長さを書き込んで
TMemoryStream.Write(Comment,StrLen(Comment)-2);とすればいいと思いま
す。

この辺はバイナリエディタで見ながらいろいろ試してみてください。

では、フォームにTButtonとTOpenPictureDialogを一つ配置して以下を試し
てみてください。
}

procedure SaveJpeg(const FileName:String;Comments:TStrings);
var
 Jpg : TJPEGImage;
 Temp,OutFile : TMemoryStream;
 PComment : PChar;//コメント
 FComment : WORD;
begin
 Jpg := TJPEGImage.Create;
 Temp := TMemoryStream.Create;
 OutFile := TMemoryStream.Create;

 PComment := Comments.GetText;
 try
  {DelphiのTJPEGImageでの利用を想定しているので
   Temp.LoadFromFileは使用していません。}
  Jpg.LoadFromFile(FileName);
  Jpg.SaveToStream(Temp);
  Temp.Position := 0;

  //ファイルの先頭から20バイトコピー
  OutFile.CopyFrom(Temp,20);

  //コメントヘッダを書き込む
  FComment := Swap($FFFE);
  OutFile.Write(FComment,2);

  {コメントの長さ情報を書き込む。
   ここではコメントから一番最後の改行コードを削除して
   コメントを書き込むので文字列の長さをそのまま代入}
  FComment := Swap(StrLen(PComment));
  OutFile.Write(FComment,2);

  {OutFile.Write(PComment,StrLen(PComment)-2);としない
   FAQ#154を参照}
  OutFile.Write(PComment^,StrLen(PComment)-2);

  {もしPCommentをStringで宣言したなら以下のようにする
   OutFile.Write(PChar(PComment)^,Length(PComment)-2);}

  //残りのデータをコピー
  OutFile.CopyFrom(Temp,Temp.Size - Temp.Position);
  OutFile.Position := 0;
  OutFile.SaveToFile('C:\Windows\デスクトップ\TEST.jpg');
 finally
  Jpg.Free;
  Temp.Free;
  OutFile.Free;
 end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 Comments : TStringList;
begin
 with OpenPictureDialog1 do begin
  Filter := GraphicFilter(TJPEGImage);
  if Execute then begin
   Comments := TStringList.Create;
   try
    Comments.Add('コメント1行目');
    Comments.Add('コメント2行目');
    Comments.Add('3行目(改行無し)');
    SaveJpeg(FileName,Comments);
   finally
    Comments.Free;
   end;
  end;
 end;
end;

//                                      紅月 燐火(BZF05041)

Original document by 紅月 燐火      氏 ID:(BZF05041)


ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。

Copyright 1996-2002 Delphi Users' Forum