2013-08-06 24 views
5

Mam duży obraz w dobrej jakości (dla moich potrzeb), potrzebuję zmienić rozmiar na mały rozmiar (30 x 30 pikseli), zmieniam jego rozmiar za pomocą grafiki.DrawImage. Ale po zmianie rozmiaru staje się rozmazany i trochę lżejszy. również Mam spróbować CompositingQuality i InterpolationMode, ale wszystko było złe.Jak zmienić rozmiar obrazu bez utraty jakości?

Przykład, że jakość, którą próbuję dostać.

Mój wynik

Zmieniano Obraz ikony rysuję sobie, może będzie lepiej zwrócić go bez mała zmiana rozmiaru?

Edit2

Resizeing Kod:

   Bitmap tbmp; 
       //drawing all my features in tbmp with graphics 
       bmp = new Bitmap(width + 5, height + 5); 
       bmp.MakeTransparent(Color.Black); 
       using (var gg = Graphics.FromImage(bmp)) 
       { 
        gg.CompositingQuality = CompositingQuality.HighQuality; 
        // gg.SmoothingMode = SmoothingMode.HighQuality; 
        gg.InterpolationMode = InterpolationMode.HighQualityBicubic; 

        gg.DrawImage(tbmp, new Rectangle(0, 0, width, height), new Rectangle(GXMin, GYMin, GXMax + 20, GYMax + 20), GraphicsUnit.Pixel); 
        gg.Dispose(); 
       } 
+4

Obraz w skali, nie tracąc jakości = Grafika wektorowa, a nie bitmapy. –

+0

Czy możesz pokazać nam * rzeczywisty kod *, którego używasz do zmiany rozmiaru? –

+0

Dodano aktualny kod – BOBUK

Odpowiedz

6

używam tę metodę jako sposób, aby uzyskać obraz miniatury (w dowolnym rozmiarze) od oryginału (dowolnego rozmiaru). Pamiętaj, że występują nieodłączne problemy, gdy pytasz o stosunek rozmiaru, który znacznie różni się od oryginału. Najlepiej zapytać o rozmiary, które różnią się między sobą:

public static Image GetThumbnailImage(Image OriginalImage, Size ThumbSize) 
{ 
    Int32 thWidth = ThumbSize.Width; 
    Int32 thHeight = ThumbSize.Height; 
    Image i = OriginalImage; 
    Int32 w = i.Width; 
    Int32 h = i.Height; 
    Int32 th = thWidth; 
    Int32 tw = thWidth; 
    if (h > w) 
    { 
     Double ratio = (Double)w/(Double)h; 
     th = thHeight < h ? thHeight : h; 
     tw = thWidth < w ? (Int32)(ratio * thWidth) : w; 
    } 
    else 
    { 
     Double ratio = (Double)h/(Double)w; 
     th = thHeight < h ? (Int32)(ratio * thHeight) : h; 
     tw = thWidth < w ? thWidth : w; 
    } 
    Bitmap target = new Bitmap(tw, th); 
    Graphics g = Graphics.FromImage(target); 
    g.SmoothingMode = SmoothingMode.HighQuality; 
    g.CompositingQuality = CompositingQuality.HighQuality; 
    g.InterpolationMode = InterpolationMode.High; 
    Rectangle rect = new Rectangle(0, 0, tw, th); 
    g.DrawImage(i, rect, 0, 0, w, h, GraphicsUnit.Pixel); 
    return (Image)target; 
} 
+0

Witam, czy to działa również na skalowanie? –

+0

@ObiOnuorah Nic nie działa dobrze dla skalowania w górę poza oryginalny rozmiar obrazu ... tam właśnie nie są dostępne informacje o obrazie. – DonBoitnott

Powiązane problemy