2012-04-25 6 views
4

У меня есть изображение, которое я хочу обрезать, когда я нажимаю кнопку на форме. У меня есть следующий код, который запускается при нажатии на кнопку, но он не делает ничего, чтобы картинки:Обрезать изображение в C#

try 
{ 
    Image image = Image.FromFile("test.jpg"); 
    Bitmap bmp = new Bitmap(200, 200, PixelFormat.Format24bppRgb); 
    bmp.SetResolution(80, 60); 

    Graphics gfx = Graphics.FromImage(bmp); 
    gfx.SmoothingMode = SmoothingMode.AntiAlias; 
    gfx.InterpolationMode = InterpolationMode.HighQualityBicubic; 
    gfx.PixelOffsetMode = PixelOffsetMode.HighQuality; 
    gfx.DrawImage(image, new Rectangle(0, 0, 200, 200), 10, 10, 200, 200, GraphicsUnit.Pixel); 
    // Dispose to free up resources 
    image.Dispose(); 
    bmp.Dispose(); 
    gfx.Dispose(); 
} 
catch (Exception ex) 
{ 
    MessageBox.Show(ex.Message); 
}  

Мой образ на самом деле скриншот активного окна формы со следующим кодом:

Rectangle bounds = this.Bounds; 
using (Bitmap bitmap = new Bitmap(bounds.Width, bounds.Height)) 
{ 
    using (Graphics g = Graphics.FromImage(bitmap)) 
    { 
    g.CopyFromScreen(new Point(bounds.Left, bounds.Top), Point.Empty, bounds.Size); 
    } 
    bitmap.Save("test.jpg", ImageFormat.Jpeg); 
} 

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

+2

Возможно, вы должны удалить свой [другой вопрос] (http://stackoverflow.com/q/10312721/719186), так как у этого есть пример кода. Пожалуйста, не публикуйте дубликаты. – LarsTech

ответ

3

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

try 
{ 
    Image image = Image.FromFile("test.jpg"); 
    Bitmap bmp = new Bitmap(200, 200, PixelFormat.Format24bppRgb); 
    bmp.SetResolution(80, 60); 

    Graphics gfx = Graphics.FromImage(bmp); 
    gfx.SmoothingMode = SmoothingMode.AntiAlias; 
    gfx.InterpolationMode = InterpolationMode.HighQualityBicubic; 
    gfx.PixelOffsetMode = PixelOffsetMode.HighQuality; 
    gfx.DrawImage(image, new Rectangle(0, 0, 200, 200), 10, 10, 200, 200, GraphicsUnit.Pixel); 

    //Need to write the file to memory then save it 
    MemorySteam ms = new MemoryStream(); 
    bmp.Save(ms, image.RawFormat); 
    byte[] buffer = ms.GetBuffer(); 

    var stream = new MemorySteam((buffer), 0, buffer.Length); 
    var croppedImage = SD.Image.FromStream(steam, true); 
    croppedImage.Save("/your/path/image.jpg", croppedImage.RawFormat); 

    // Dispose to free up resources 
    image.Dispose(); 
    bmp.Dispose(); 
    gfx.Dispose(); 
    stream.Dispose(); 
    croppedImage.Dispose(); 

} 
catch (Exception ex) 
{ 
    MessageBox.Show(ex.Message); 
} 
+1

Не могли бы вы рассказать мне, что такое «SD» в «var croppedImage = SD.Image.FromStream (steam, true)»; ?. Благодарю. –

0

У вас будет результат в переменной bmp. Вы можете продолжить работу над этим. Если вы избавитесь от этого объекта, ваши изменения, конечно, будут потеряны.

0

Я создал метод для одного из моих проектов, здесь метода попробовать использовать его и посмотреть, если он работает:

public void ResizeImage(string sImageFile, decimal dWidth, decimal dHeight, string sOutputFile) 
    { 
     Image oImg = Bitmap.FromFile(sImageFile); 
     Bitmap oBMP = new Bitmap(decimal.ToInt16(dWidth), decimal.ToInt16(dHeight)); 

     Graphics g = Graphics.FromImage(oBMP); 
     g.PageUnit = pgUnits; 
     g.SmoothingMode = psMode; 
     g.InterpolationMode = piMode; 
     g.PixelOffsetMode = ppOffsetMode; 

     g.DrawImage(oImg, 0, 0, decimal.ToInt16(dWidth), decimal.ToInt16(dHeight)); 

     ImageCodecInfo oEncoder = GetEncoder(); 
     EncoderParameters oENC = new EncoderParameters(1); 

     oENC.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, plEncoderQuality); 

     oImg.Dispose(); 

     oBMP.Save(sOutputFile, oEncoder, oENC); 
     g.Dispose(); 

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