2015-07-07 31 views
5

TPngObject yeniden boyutlandırmak ve boşuna şeffaflık + alfa kanallarını korumak için bir yol arıyoruz sonra ben GDI İşte +GDI +? Kullanarak PNG görüntüsünü Alfa kanalları ile yeniden boyutlandırma?

benim kodudur kullanmaya çalışıyorum ve o iyi iş gibi görünüyor. bir PNG'yi küçültecek/büyütecektir. şimdiye kadar XP üzerinde test:

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; 

Benim sorum: GetThumbnailImage Bunu yapmanın doğru yolu kullanıyor? Başka bir yöntem bulamadım. Ben GetThumbnailImage yöntemin kullanılarak sanmıyorum

cevap

7

Ben GetThumbnailImage yöntem sana kaliteli bir resampled görüntü elde şüphe çünkü gitmek için iyi bir yol olduğunu sanmıyorum. this article'da görüntüyü yeniden ölçeklendirmeyi bulabilirsiniz. Bunun için DrawImage yöntemini kullanıyorlar, ben de aynısını yapacağım. Bundan önce de yüksek kaliteli grafik modları elde etmek için yüksek kaliteli grafik modları belirleyecektim. İşte bir örnek:

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

Saydamlık/alfanın neden burada/nasıl kaldığını anlamıyorum, ama işe yarıyor :) teşekkür ederim! – zig

+3

Rica ederim! Alfa kanalı, çıkış bitmap formatı nedeniyle korunur (belirsiz aşırı yüklenmeden dolayı varsayılan olsa bile açıkça belirtmem gerekiyordu). Ör. 'PixelFormat32bppRGB', alfa kanalı kaybedersiniz. Ve kendi kendini şeffaflaştırmayı (salt GDI'da bile) düşünür. – TLama

+0

Teşekkürler. BTW, GetThumbnailImage, görüntüyü da oldukça güzel bir şekilde örnekliyor gibi görünüyor. – zig

2

doğru yaklaşımdır. Niye ya?

GetThumbnailImage yöntemin ana kullanım bazı yüksek çözünürlüklü görüntünün bir önizleme olarak kullanabileceği bir küçük resim oluyor.

nedenle Geride kullanılmaktadır mümkün olduğunca hızlı olmasını geliştirilen algoritma varsayalım ama muhtemelen çok sonuç kalitesi hakkında umursamıyor. Bu nedenle bu yöntemin kullanılması, oldukça kötü kalitede yeniden boyutlandırılmış görüntülere yol açabilir.


Şimdi o zaman kesinlikle Graphics32 kitaplığı (http://graphics32.org/wiki/) kontrol etmelidir Delphi kullanarak resim işleme gerçekten ilgileniyorsanız.

O kadar Delphi 7 ve tüm Delphi sürümlerini desteklemektedir. Birçok gelişmiş görüntü işleme algoritması sağlar. Ve hepsinden önemlisi, donanım hızlandırmayı destekliyor, bu da aslında bu görüntü manipülasyonlarını yapmak için GPU işlem gücünüzden faydalanabileceği anlamına geliyor.