2015-07-07 17 views
5

Sau khi tìm kiếm một cách để thay đổi kích thước TPngObject và duy trì các kênh bạch + alpha không có kết quả, tôi đang cố gắng để sử dụng GDI +Làm cách nào để thay đổi kích thước hình ảnh PNG bằng các kênh Alpha bằng GDI +?

Đây là mã của tôi, và nó dường như để hoạt động tốt. nó sẽ giảm/tăng tỷ lệ PNG. Tested trên XP cho đến nay:

uses GDIPAPI, GDIPOBJ, GDIPUTIL; 

procedure TForm1.Button1Click(Sender: TObject); 
var 
    encoderClsid: TGUID; 
    stat: TStatus; 
    img, img_out: TGPImage; 
begin 
    img := TGPImage.Create('in.png'); // 200 x 200 
    img_out := img.GetThumbnailImage(100, 100, nil, nil); 
    GetEncoderClsid('image/png', encoderClsid); 
    img_out.Save('out.png', encoderClsid); 
    img_out.free; 
    img.Free; 
end; 

Câu hỏi của tôi: được sử dụng GetThumbnailImage cách chính xác để làm điều này? Tôi không tìm thấy phương pháp nào khác.

Trả lời

7

Tôi không nghĩ rằng phương pháp GetThumbnailImage là một cách hay để đi vì tôi nghi ngờ rằng bạn sẽ nhận được hình ảnh được lấy mẫu chất lượng cao. Trong this article bạn có thể tìm cách cách rescale hình ảnh. Họ đang sử dụng phương pháp DrawImage cho điều đó, vì vậy tôi sẽ làm như vậy. Ngay trước đó tôi cũng sẽ thiết lập chế độ đồ họa chất lượng cao để có được chất lượng cao. Dưới đây là ví dụ:

procedure TForm1.Button1Click(Sender: TObject); 
var 
    Input: TGPImage; 
    Output: TGPBitmap; 
    Encoder: TGUID; 
    Graphics: TGPGraphics; 
begin 
    Input := TGPImage.Create('C:\InputImage.png'); 
    try 
    // create the output bitmap in desired size 
    Output := TGPBitmap.Create(100, 100, PixelFormat32bppARGB); 
    try 
     // create graphics object for output image 
     Graphics := TGPGraphics.Create(Output); 
     try 
     // set the composition mode to copy 
     Graphics.SetCompositingMode(CompositingModeSourceCopy); 
     // set high quality rendering modes 
     Graphics.SetInterpolationMode(InterpolationModeHighQualityBicubic); 
     Graphics.SetPixelOffsetMode(PixelOffsetModeHighQuality); 
     Graphics.SetSmoothingMode(SmoothingModeHighQuality); 
     // draw the input image on the output in modified size 
     Graphics.DrawImage(Input, 0, 0, Output.GetWidth, Output.GetHeight); 
     finally 
     Graphics.Free; 
     end; 
     // get encoder and encode the output image 
     if GetEncoderClsid('image/png', Encoder) <> -1 then 
     Output.Save('C:\OutputImage.png', Encoder) 
     else 
     raise Exception.Create('Failed to get encoder.'); 
    finally 
     Output.Free; 
    end; 
    finally 
    Input.Free; 
    end; 
end; 
+0

Tôi không hiểu tại sao/cách tính minh bạch/alpha duy trì ở đây, nhưng nó hoạt động :) cảm ơn bạn! – zig

+3

Bạn được chào đón! Kênh alpha được bảo toàn vì định dạng bitmap đầu ra (mà tôi đã phải chỉ định rõ ràng ngay cả khi nó là mặc định do quá tải không rõ ràng). Nếu bạn muốn sử dụng, ví dụ: 'PixelFormat32bppRGB', bạn sẽ mất kênh alpha. Và việc render chính nó xem xét tính minh bạch (ngay cả trong GDI thuần túy). – TLama

+0

Cảm ơn. BTW, GetThumbnailImage dường như lại mẫu hình ảnh khá độc đáo quá. – zig

2

Tôi không nghĩ rằng việc sử dụng phương thức GetThumbnailImage là phương pháp chính xác. Tại sao?

Sử dụng chính phương pháp GetThumbnailImage là nhận hình thu nhỏ mà bạn có thể sử dụng làm bản xem trước của một số hình ảnh có độ phân giải cao hơn.

Vì vậy, tôi giả sử thuật toán được sử dụng phía sau được phát triển càng nhanh càng tốt nhưng có lẽ nó không quan tâm đến chất lượng kết quả cuối cùng nhiều. Vì vậy, việc sử dụng phương pháp này có thể dẫn đến các hình ảnh được thay đổi kích cỡ với chất lượng khá kém.


Bây giờ nếu bạn đang thực sự quan tâm đến việc xử lý ảnh sử dụng Delphi sau đó bạn chắc chắn nên kiểm tra thư viện Graphics32 (http://graphics32.org/wiki/).

Nó hỗ trợ tất cả các phiên bản Delphi từ Delphi 7 trở lên. Nó cung cấp nhiều thuật toán thao tác hình ảnh tiên tiến. Và tốt nhất của tất cả nó hỗ trợ tăng tốc phần cứng có nghĩa là nó thực sự có thể sử dụng sức mạnh xử lý GPU của bạn để làm cho những thao tác hình ảnh đó.

Các vấn đề liên quan