2012-11-22 7 views
1

нужна помощь. я хочу, чтобы изменить определенную картину, но когда я запускаю этот код он дает мне ошибку: { «Произошла общая ошибка в GDI +.»}Изменение размера изображения C#

private void btnPic_Click(object sender, EventArgs e) 
     { 
      OpenFileDialog open = new OpenFileDialog(); 
      open.Filter = "Images|*.bmp;*.jpg;*.gif|All files|*.*"; 

      if (open.ShowDialog(this) == DialogResult.OK) 
      { 

       var image = Image.FromFile(open.FileName); 
       var newImage = ScaleImage(image, 300, 400); 
       newImage.Save(@open.FileName, ImageFormat.Png); 

      } 
} 


public static Image ScaleImage(Image image, int maxWidth, int maxHeight) 
     { 
      var ratioX = (double)maxWidth/image.Width; 
      var ratioY = (double)maxHeight/image.Height; 
      var ratio = Math.Min(ratioX, ratioY); 

      var newWidth = (int)(image.Width * ratio); 
      var newHeight = (int)(image.Height * ratio); 

      var newImage = new Bitmap(newWidth, newHeight); 
      Graphics.FromImage(newImage).DrawImage(image, 0, 0, newWidth, newHeight); 
      return newImage; 
     } 
+0

В какой именно строке кода вы получаете сообщение об ошибке? –

+0

Что такое @ open.FileName? –

+0

Работает ли оно, если вы сохраняете изображение в новом имени? – CodeCaster

ответ

1

Вы можете попробовать использовать эту версию вместо этого.

private void btnPic_Click(object sender, EventArgs e) 
{ 
    OpenFileDialog open = new OpenFileDialog(); 
    open.Filter = "Images|*.bmp;*.jpg;*.gif|All files|*.*"; 

    if (open.ShowDialog(this) == DialogResult.OK) 
    { 

     var image = Image.FromFile(open.FileName); 
     var newImage = ResizeCenterCropped(image, 300, 400); 
     newImage.Save(@open.FileName, ImageFormat.Png); 

    } 
} 

public static Image ResizeCenterCropped(Image image, int width, int height) 
{ 
    var rect = CreateCroppedRectangle(image, width, height); 
    rect.X = (image.Width/2) - (rect.Width/2); 
    rect.Y = (image.Height/2) - (rect.Height/2); 
    return Resize(image, new Rectangle(0, 0, width, height), rect); 
} 

public static Image Resize(Image image, Rectangle destRectange, Rectangle sourceRectangle) 
{ 
    var rezisedImage = new Bitmap(destRectange.Width, destRectange.Height) 
    using (var g = Graphics.FromImage(rezisedImage)) 
    { 
     g.SmoothingMode = SmoothingMode.AntiAlias; 
     g.InterpolationMode = InterpolationMode.HighQualityBicubic; 
     g.PixelOffsetMode = PixelOffsetMode.HighQuality; 
     g.DrawImage(image, destRectange, sourceRectangle, GraphicsUnit.Pixel); 
     return rezisedImage; 
    } 
} 

public static Rectangle CreateCroppedRectangle(Image image, int width, int height) 
{ 
    var size = new Size(width, height); 
    var size2 = new Size(image.Width, image.Height); 

    //The maximum scale width we could use 
    float maxWidthScale = (float)size2.Width/(float)size.Width; 

    //The maximum scale height we could use 
    float maxHeightScale = (float)size2.Height/(float)size.Height; 

    //Use the smaller of the 2 scales for the scaling 
    float scale = Math.Min(maxHeightScale, maxWidthScale); 


    size.Width = (int)(size.Width * scale); 
    size.Height = (int)(size.Height * scale); 

    return new Rectangle(new Point(), size); 
} 
+0

Привет ... Спасибо У меня есть другое scenerio, чтобы реализовать изменение размера, но достигнуто с помощью этого кода ... Большое спасибо ... Могу ли я использовать его для изменения размера bmp? –

1

В то время как вы экономите, ваш поток остается открытым для open.FileName, и вы не можете сохранить другой файл с таким же именем. Вы должны либо сделать image.Dispose(), чтобы освободить дескриптор, чтобы Сохранить можно перезаписать, или вы должны изменить имя файла.

private void button1_Click(object sender, EventArgs e) 
     { 
      OpenFileDialog open = new OpenFileDialog(); 
      open.Filter = "Images|*.bmp;*.jpg;*.gif|All files|*.*"; 

      if (open.ShowDialog(this) == DialogResult.OK) 
      { 

       var image = Image.FromFile(open.FileName); 
       var newImage = ScaleImage(image, 300, 400); 
       image.Dispose();//Add this to your code 
       newImage.Save(open.FileName, ImageFormat.Png); 
      } 

Или изменить имя файла

private void button1_Click(object sender, EventArgs e) 
     { 
      OpenFileDialog open = new OpenFileDialog(); 
      open.Filter = "Images|*.bmp;*.jpg;*.gif|All files|*.*"; 

      if (open.ShowDialog(this) == DialogResult.OK) 
      { 

       var image = Image.FromFile(open.FileName); 
       var newImage = ScaleImage(image, 300, 400); 
       string path = "1.png"; 
       newImage.Save(open.FileName, ImageFormat.Png); 
      } 
Смежные вопросы