Jpg / Gif / Bitmapをロードしてビットマップに変換

bitmap delphi file-format image-processing vcl

XMLファイルから画像を読み込む必要があります。 画像がJPG / GIF / BMPかどうかについてのXMLファイルに情報はありません。 画像を読み込んだ後、それをビットマップに変換する必要があります。

実際のファイル形式を知らなくても、イメージをビットマップに変換する方法について何か手がかりがあるでしょうか。 Delphi 2007/2009を使用しています

ありがとうございました。

  16  13


ベストアンサー

Delphi 2009にはJPEG、BMP、GIF、PNGのサポートが組み込まれています。

Delphiの以前のバージョンでは、PNGおよびGIFのサードパーティの実装を見つける必要がありますが、Delphi 2009では、uses句に単純に + Jpeg ++ pngimage +、および `+ GIFImg +`ユニットを追加します。

ファイルに拡張子が付いている場合は、他の人が指摘したように、TPicture.LoadFromFileは継承するクラスによって登録されている拡張子を調べて、どのイメージをロードするかを決定します。

uses
  Graphics, Jpeg, pngimage, GIFImg;

procedure TForm1.Button1Click(Sender: TObject);
var
  Picture: TPicture;
  Bitmap: TBitmap;
begin
  Picture := TPicture.Create;
  try
    Picture.LoadFromFile('C:\imagedata.dat');
    Bitmap := TBitmap.Create;
    try
      Bitmap.Width := Picture.Width;
      Bitmap.Height := Picture.Height;
      Bitmap.Canvas.Draw(0, 0, Picture.Graphic);
      Bitmap.SaveToFile('C:\test.bmp');
    finally
      Bitmap.Free;
    end;
  finally
    Picture.Free;
  end;
end;

ファイルの拡張子がわからない場合は、最初の数バイトを調べてイメージの種類を確認します。

procedure DetectImage(const InputFileName: string; BM: TBitmap);
var
  FS: TFileStream;
  FirstBytes: AnsiString;
  Graphic: TGraphic;
begin
  Graphic := nil;
  FS := TFileStream.Create(InputFileName, fmOpenRead);
  try
    SetLength(FirstBytes, 8);
    FS.Read(FirstBytes[1], 8);
    if Copy(FirstBytes, 1, 2) = 'BM' then
    begin
      Graphic := TBitmap.Create;
    end else
    if FirstBytes = #137'PNG'#13#10#26#10 then
    begin
      Graphic := TPngImage.Create;
    end else
    if Copy(FirstBytes, 1, 3) =  'GIF' then
    begin
      Graphic := TGIFImage.Create;
    end else
    if Copy(FirstBytes, 1, 2) = #$FF#$D8 then
    begin
      Graphic := TJPEGImage.Create;
    end;
    if Assigned(Graphic) then
    begin
      try
        FS.Seek(0, soFromBeginning);
        Graphic.LoadFromStream(FS);
        BM.Assign(Graphic);
      except
      end;
      Graphic.Free;
    end;
  finally
    FS.Free;
  end;
end;

33


もっと簡単な方法を見つけました! JPG / GIF / BMPなどを読み込みます。 ファイル形式を知らなくてもチェックせずに自動的にファイルを変換し、それに応じて変換します。 それは私にとって完璧に機能しました。

ここでそれを共有する:)

クラス、ExtCtrls、グラフィック、axCtrlsを使用します。

手順TForm1.Button1Click(送信者:TObject); Var OleGraphic:TOleGraphic; fs:TFileStream。ソース:TImage。 BMP:TBitmap。試してみてくださいOleGraphic:= TOleGraphic.Create; {魔法のクラス!}

fs:= TFileStream.Create( 'c:\ testjpg.dat'、fmOpenReadまたはfmSharedenyNone); OleGraphic.LoadFromStream(fs);

出典:= Timage.Create(Nil); Source.Picture.Assign(OleGraphic);

BMP:= TBitmap.Create; {ビットマップへの変換} bmp.Width:= Source.Picture.Width; bmp.Height:= source.Picture.Height; bmp.Canvas.Draw(0、0、source.Picture.Graphic);

image1.Picture.Bitmap:= bmp; {フォームにビットマップを表示する}最後にfs.Free; OleGraphic.Free; Source.Free; bmp.Free;終わり;終わり;

14


このメソッドはファイル拡張子を使用して、登録されているグラフィック形式のどれを読み込む必要があるかを判断するため、グラフィックの形式がわからない場合は、「+ TPicture.LoadFromFile 」を使用できません。 一致する ` TPicture.LoadFromStream +`メソッドがない理由があります。

実行時にデータを調べてグラフィック形式を決定できる外部ライブラリが最善の解決策です。 あなたの研究の出発点としてhttp://www.efg2.com/Lab/Library/Delphi/Graphics/FileFormatsAndConversion.htm [efg page]を使用することができます。

手っ取り早い解決策は、成功するまで処理する必要があるいくつかの形式を試すことです。

function TryLoadPicture(const AFileName: string; APicture: TPicture): boolean;
const
  GraphicClasses: array[0..3] of TGraphicClass = (
    TBitmap, TJPEGImage, TGIFImage, TPngImage);
var
  FileStr, MemStr: TStream;
  ClassIndex: integer;
  Graphic: TGraphic;
begin
  Assert(APicture <> nil);
  FileStr := TFileStream.Create('D:\Temp\img.dat', fmOpenRead);
  try
    MemStr := TMemoryStream.Create;
    try
      MemStr.CopyFrom(FileStr, FileStr.Size);
      // try various
      for ClassIndex := Low(GraphicClasses) to High(GraphicClasses) do begin
        Graphic := GraphicClasses[ClassIndex].Create;
        try
          try
            MemStr.Seek(0, soFromBeginning);
            Graphic.LoadFromStream(MemStr);
            APicture.Assign(Graphic);
            Result := TRUE;
            exit;
          except
          end;
        finally
          Graphic.Free;
        end;
      end;
    finally
      MemStr.Free;
    end;
  finally
    FileStr.Free;
  end;
  Result := FALSE;
end;

編集:

GraphicClass := FileFormatList.GraphicFromContent(...);

グラフィックフォーマットを決定します。 これは、あなたが言及したVB6のやり方と非常によく似ているようです。 たぶんあなたはあなたの目的のためにこのライブラリを使うことができます。

9


Delphi 2007または2009には、これがどちらのバージョンでも機能するかどうかを確認するためのものはありません。 ただし、XE2には、「+ TWICImage 」と呼ばれる「 Vcl.Graphics 」という別のクラスがあり、* BMP、GIF、ICO、JPEG、PNG、TIF、Windows Media Photo *など、_Microsoft Imaging Component_でサポートされる画像を処理します。 ストリームから画像の種類を検出することができます。 _Image1_というフォームに ` TImage +`があると仮定します。

procedure LoadImageFromStream(Stream: TStream; Image: TImage);
var
  wic: TWICImage;
begin
  Stream.Position := 0;
  wic := TWICImage.Create;
  try
    wic.LoadFromStream(Stream);
    Image.Picture.Assign(wic);
  finally
    wic.Free;
  end;
end;

procedure RenderImage(const Filename: string);
var
  fs: TFileStream;
begin
  fs := TFileStream.Create(Filename, fmOpenRead);
  try
    LoadImageFromStream(fs, Image1);
  finally
    fs.Free;
  end;
end;

+ uses +`ステートメントに `+ PNGImage ++ GIFImg +、または `+ JPEG +`を追加せずに機能します。

他の答えは、 `+ TImage `をBMPに変換する方法を示しているため、ここには含めません。 画像タイプやファイル拡張子を事前に知らなくても、さまざまなグラフィックタイプを ` TImage +`にロードする別の方法を示しています…​

6


タイトルとURLをコピーしました