2014-11-28 2 views
0

Я пытаюсь обрезать и изменять размер головы Стива, скин по умолчанию для Minecraft! :-)Как я могу обрезать и изменять размер изображения?

Но у меня возникают некоторые проблемы, я получил кадрирование вниз, но изменения размера не работает, а изображение все размыто :-(

Мой XAML:

<Image Height="60" Width="60" Name="ProfileImage" Stretch="UniformToFill" /> 

Мой код позади:

private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     System.Drawing.Rectangle cropRect = new System.Drawing.Rectangle(8,8,8,8); 
     Bitmap source = System.Drawing.Image.FromFile("steve.png") as Bitmap; 
     Bitmap target = new Bitmap(60, 60); 

     using(Graphics g = Graphics.FromImage(target)) 
     { 
      g.DrawImage(source, 
       new System.Drawing.Rectangle(0, 0, target.Width, target.Height), 
       cropRect, 
       GraphicsUnit.Pixel); 
      g.Dispose(); 

      ProfileImage.Source = CreateBitmapSourceFromBitmap(target); 
     } 
    } 

    public static BitmapSource CreateBitmapSourceFromBitmap(Bitmap bitmap) 
    { 
     if (bitmap == null) 
      throw new ArgumentNullException("bitmap"); 

     return System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
      bitmap.GetHbitmap(), 
      IntPtr.Zero, 
      Int32Rect.Empty, 
      BitmapSizeOptions.FromEmptyOptions()); 
    } 

кто-нибудь есть ключ кожа выглядит так, и головную часть, что я хочу (8,8,8 (ширина), 8 (высота)):

enter image description here

+0

Когда вы говорите «blury» вы имеете в виду некачественно? Если вы измените размер изображения 8px x 8px на 60px x 60px, он будет выглядеть пикселизованным, вы просто делаете пиксели больше. –

+0

Проблема заключается в том, что она не является «пиксельной», а не резким изображением. Похоже, что кто-то забрызгал воду на водонепроницаемую краску: D – Jason94

+0

Не совсем уверен, что бы это было похоже, но похоже, что она интерполирует, чтобы попытаться сгладить края больших пикселей. Вы действительно хотите пикселизованное изображение, а не интерполированное? –

ответ

2

Если вы хотите сохранить форму квадрата пикселя при изменении размера, то вам просто нужно изменить режим интерполяции в Graphics объекта, который вы используете, чтобы сделать рисунок:

g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor; 

g.DrawImage(source, 
      new System.Drawing.Rectangle(0, 0, target.Width, target.Height), 
      cropRect, 
      GraphicsUnit.Pixel); 

Ниже показаны NearestNeighbor интерполяция слева и интерполяция Default (билинейная) справа.

enter image description here

+0

Был полностью Ближайшим Небо, что мне не хватало! Благодаря! – Jason94

2

Вы можете сделать это без каких-либо WinForms (System.Drawing) вещи, установив RenderOptions.BitmapScalingMode в NearestNeighbor на контроле изображения

<Image Height="60" Width="60" Name="ProfileImage" Stretch="UniformToFill" 
     RenderOptions.BitmapScalingMode="NearestNeighbor"/> 

и используя CroppedBitmap для изображения в Source:

var steve = new BitmapImage(new Uri("steve.png", UriKind.Relative)); 
ProfileImage.Source = new CroppedBitmap(steve, new Int32Rect(8, 8, 8, 8)); 

Вы даже можете сделать это полностью в XAML:

<Image Height="60" Width="60" RenderOptions.BitmapScalingMode="NearestNeighbor"> 
    <Image.Source> 
     <CroppedBitmap Source="steve.png" SourceRect="8,8,8,8"/> 
    </Image.Source> 
</Image> 
+0

Ваше решение для этого полностью в XAML было приятным :-) – Jason94

+0

Да, это экономит много кода. И серьезно, вы должны избегать этого материала WinForms. – Clemens

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