2016-04-27 4 views
1

Я пытаюсь обрезать jpeg-файл, используя (x, y) координаты, ширину и высоту и сохранить вывод в том же месте (например, заменить). Я попробовал приведенный ниже код, но не работал.Как обрезать и сохранить файл изображения jpeg в C#

public void CropImage(int x, int y, int width, int height) 
{ 

string image_path = @"C:\Users\Admin\Desktop\test.jpg"; 

var img = Image.FromFile(image_path); 

Rectangle crop = new Rectangle(x, y, width, height); 

Bitmap bmp = new Bitmap(crop.Width, crop.Height); 
using (var gr = Graphics.FromImage(bmp)) 
{ 
    gr.DrawImage(img, new Rectangle(0, 0, bmp.Width, bmp.Height), crop, GraphicsUnit.Pixel); 
} 


if (System.IO.File.Exists(image_path)) 
{ 
    System.IO.File.Delete(image_path); 
} 

bmp.Save(image_path, ImageFormat.Jpeg); 
} 

Это дает ошибку, как:

исключение типа 'System.IO.IOException' произошло в mscorlib.dll, но не был обработан в пользовательском коде

Дополнительная информация : Процесс не может получить доступ к файлу 'C: \ Users \ Admin \ Desktop \ test.jpg', потому что он используется другим процессом .

Когда я добавляю img.Dispose() я не получаю вышеуказанную ошибку, и я в состоянии спасти it.But он сохраняет пустое изображение с заданной шириной и высотой.

Может ли кто-нибудь помочь мне с этим?

+1

Старое изображение по-прежнему заблокировано вашим кодом. Вы можете выбрать другое имя или прочитать одно из сообщений о том, как разблокировать. Поиск 'C# Сохранить jpeg IOException' – TaW

+0

@TaW, Даже когда я даю новый путь, я получал пустое изображение с заданной шириной и высотой –

+0

It не должно быть пустым, если вы не избавитесь от него. Наблюдайте за порядком Rectangles! См. [Здесь] (https://msdn.microsoft.com/en-us/library/ms142040%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396) – TaW

ответ

5
public void CropImage(int x, int y, int width, int height) 
{ 
    string imagePath = @"C:\Users\Admin\Desktop\test.jpg"; 
    Bitmap croppedImage; 

    // Here we capture the resource - image file. 
    using (var originalImage = new Bitmap(imagePath)) 
    { 
     Rectangle crop = new Rectangle(x, y, width, height); 

     // Here we capture another resource. 
     croppedImage = originalImage.Clone(crop, originalImage.PixelFormat); 

    } // Here we release the original resource - bitmap in memory and file on disk. 

    // At this point the file on disk already free - you can record to the same path. 
    croppedImage.Save(imagePath, ImageFormat.Jpeg); 

    // It is desirable release this resource too. 
    croppedImage.Dispose(); 
} 
+0

Это также сохраняет пустой файл jpeg с заданной высотой и шириной. Я дал полный путь в пути к картинке, например '@" C: \ Users \ Admin \ Desktop \ test.jpg' –

+0

@ J19 - Путь не важен. Он должен работать. –

+0

Я не знаю, почему, это дает мне пустой jpeg-файл –