2016-03-23 9 views
0

3/24/2016 私は76歳ですが、私はそれが意味をなさないと思ったと書いたとき、他の人のように私が何を求めているのか分かりません。ここで私は一緒にインターネットを精練することから(それほど美しいものではない)一緒にひねったものです。それはほぼ作品、唯一欠けていることは、アスペクト比を維持しています。背の高い写真が太って見えるようにしている。 40年のプログラミングでは、おそらく2時間のコーディンググラフィックスがあったでしょう。 :)Graphics32:たくさんの画像のサイズを変更する

procedure TfrmTools.Shrink(aFn : String; Wid,Ht : Integer); 
var 
    Bmp : TBitmap; // These three are created 
    Jpg : TJpegImage; // and Freed globally 
    Dst : TBitmap32; // to save some bit-thrashing 
begin 
    try 
    Src.Bitmap.LoadFromFile(aFn); // Src = TImage32 
    Dst:=TBitmap32.Create; 
    Dst.SetSize(Wid,Ht); 
    Src.Bitmap.DrawTo(Dst,Dst.BoundsRect); 
    bmp:=TBitmap.Create; 
    jpg:=TJPEGImage.Create; 
    bmp.Assign(Dst); 
    jpg.Assign(bmp); 
    jpg.SaveToFile('D:\Test1280x720.jpg'); // Just testing 
    finally 
    Bmp.Free; // As above 
    Jpg.Free; // As above 
    Dst.Free; // As above 
    end; 
end; 

2016年3月23日 私はここで良いの魂からのアドバイスを取って、私がやったGraphis32と弾丸と嬉しいビットが、壁にヒットしています。私はデータベース内に約1200の画像のパスを持っており、表示、保存などはすべてうまくいっています。

一部の画像は6〜9MBの間にあり、 PCの画面に表示されます。私はそれらを所望のサイズ、例えば1920×1080に縮小し、H x W比を保持したい。すでに1920 x 1080より小さくても画像を縮小したくないです。

私は多くの検索と試行錯誤を行い、これまでのところエラーのみでした。ユーザーが手動で作業しているときに、スケーリングおよび/または回転後に保存部分があります。しかし、私はデータベース全体をスキャンして、その場でサイズを変更できるようにしたいと考えています。

コードスニペットが優れています。

+0

これまでに何を試しましたか?いくつかのコードを表示したり、あなたが立ち往生している部分について特定の質問をしてください。 – whosrdaddy

答えて

0

ファイル名のリストを繰り返して、サイズ変更コードをそれぞれ実行するだけです。シンプルなスタートとして...

function TForm1.ResizeImage(const Filename: String): String; 
begin 
    Result:= ''; 
    try 

    //Your resizing code here 

    except 
    on e: Exception do begin 
     Result:= e.Message; 
    end; 
    end; 
end; 

procedure TForm1.ResizeAllImages(const List: TStringList); 
var 
    X: Integer; 
    R: String; 
begin 
    for X := 0 to List.Count - 1 do begin 
    R:= ResizeImage(List[X]); 
    if R <> '' then begin 
     //Report error in a memo control 
     Memo1.Lines.Add(List[X]); 
     Memo1.Lines.Add(R); 
     Memo1.Lines.Add(''); 
    end; 
    end; 
end; 

TStringListにファイル名のリストをロードして、この文字列のリストを渡しResizeAllImagesを呼び出します。例外も報告することをお勧めします。したがって、非常に簡単なエラー報告も含まれています。あなたは間違いなくこれを拡張したいと思うでしょう、例えば、進捗バーを実装する。

プロダクション環境の場合(たとえば、配布または販売する予定のものなど)は、そのようなタスクに別のスレッドを使用することを検討するとよいでしょう。

私はまた、既存のイメージを上書きしないことを強く推奨します。何らかの出力ディレクトリを実装し、そこに新たにサイズ変更されたイメージを保存します。

+0

最初にイメージヘッダーをロードするのも良い方法です。幅と高さが含まれているため、イメージをロードする必要があるかどうかを判断したり、すぐに次のイメージに移動したりできます。 –

+0

@YuriyAfanasenkov私はそれを疑うことはありませんが、質問によると、OPはすでに1200画像のために一括して行う方法を知っているだけで、リサイジングを行う方法を知っています。それは別の質問でしょう。 –

0

この回答は大きな画像のサイズを変更すると、残りの問題はアスペクト比が欠けていると言われている3/24/2016の編集に基づいています。 BmpJpgDst変数が初期化されていないとFreeへの最終的な呼び出しを防ぐためにtry前nilledする必要が

procedure TfrmTools.Shrink(aFn : String; Wid,Ht : Integer); 
var 
    Bmp : TBitmap; // These three are created 
    Jpg : TJpegImage; // and Freed globally 
    Dst : TBitmap32; // to save some bit-thrashing 
    DstWidth, DstHeight: integer; // Add 
    AspRatio: single;    // Add 
begin 
    Bmp := nil; // not related to your question, see comment in text 
    Jpg := nil; // -"- 
    Dst := nil; // -"- 
    try 
    Src.Bitmap.LoadFromFile(aFn); // Src = TImage32 

    // Add following lines 
    DstWidth := Src.Width; 
    DstHeight := Src.Height; 
    AspRatio := Src.Width/Src.Height; 

    if (DstWidth > Wid) then 
    begin 
    DstWidth := Wid; 
    DstHeight := round(DstWidth/AspRatio); 
    end; 

    if (DstHeight > Ht) then 
    begin 
    DstHeight := Ht; 
    DstWidth := round(DstHeight * AspRatio); 
    end; 
    // end of added lines 

    Dst:=TBitmap32.Create; 
// Dst.SetSize(Wid,Ht); // Replace parameters 
    Dst.SetSize(DstWidth,DstHeight); 
    Src.Bitmap.DrawTo(Dst,Dst.BoundsRect); 
    bmp:=TBitmap.Create; 
    jpg:=TJPEGImage.Create; 
    bmp.Assign(Dst); 
    jpg.Assign(bmp); 
    jpg.SaveToFile('D:\Test1280x720.jpg'); // Just testing 
    finally 
    Bmp.Free; // As above 
    Jpg.Free; // As above 
    Dst.Free; // As above 
    end; 
end; 

:私はコメントでマークされた以下のような変更を提案適用する最大の幅と高さWid, Ht: integer二つの引数を想定すると、メモリ参照。これは、3つのオブジェクトがすべて作成される前にコードが例外を発生させた場合に発生します。

関連する問題