2016-03-23 183 views
0

2016/3/24 我是76歲,當我寫作時我認爲這是有道理的,但是和其他人一樣,我不確定我在問什麼。這是我拼湊起來的(這並不漂亮)從互聯網上衝刷出來。它幾乎的作品,唯一缺少的是保持長寬比。它使高個子看起來很胖。在40年的編程中,我可能總共花了兩個小時編碼圖形的東西。 :)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 x 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已經知道如何進行重新調整大小,只需要知道如何對1,200張圖像進行批量處理。這將是一個不同的問題。 –

0

此答案基於您編輯標記爲3/24/2016的地方,您認爲在調整大圖像尺寸時,剩餘的問題是缺失的寬高比。假設兩個參數Wid, Ht: integer是最大寬度和高度應用,我建議下面標有註釋的變化:

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; 

BmpJpgDst變量需要try之前nilled以防止最終調用Free未初始化內存引用。如果在創建所有三個對象之前有任何代碼產生異常,就可能發生這種情況。

相關問題