2013-08-06 4 views
5

У меня есть большое изображение в хорошем качестве (для моих нужд), мне нужно изменить размер до небольшого размера (30 х 30 пикселей), я изменяю его с помощью graphics.DrawImage. Но когда я изменяю размер, он становится размытым и немного легче. также я попробовал CompositingQuality и InterpolationMode, но все было плохо.Как изменить размер изображения без потери качества

Пример, это качество, которое я пытаюсь получить.

Мой результат

Отредактировано Изображение иконы я рисовать сам, может быть, это будет лучше сделать это небольшое без изменения размеров?

Edit2

Resizeing Код:

   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

Масштабировать изображение, не теряя качества = Векторная графика, а не растровые изображения. –

+0

Можете ли вы показать нам * действительный код *, который вы используете для изменения размера? –

+0

Добавленный фактический код – BOBUK

ответ

6

Я использую этот метод как способ, чтобы получить уменьшенное изображение (любого размера) с оригинала (любого размера). Обратите внимание, что есть неотъемлемые проблемы, когда вы запрашиваете отношение размера, которое сильно отличается от отношения оригинала. Лучше всего задавать размеры, которые находятся в масштабе друг к другу:

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

Привет, это работает и для масштабирования? –

+0

@ObiOnuorah Ничто не работает хорошо для масштабирования вверх за пределы исходного размера изображения ... там просто нет информации об изображении. – DonBoitnott

Смежные вопросы