Como cortar uma imagem usando c #?

Como posso escrever um aplicativo que irá cortar imagens em c #?

Você pode usar Graphics.DrawImage para desenhar uma imagem recortada no object gráfico de um bitmap.

 Rectangle cropRect = new Rectangle(...); Bitmap src = Image.FromFile(fileName) as Bitmap; Bitmap target = new Bitmap(cropRect.Width, cropRect.Height); using(Graphics g = Graphics.FromImage(target)) { g.DrawImage(src, new Rectangle(0, 0, target.Width, target.Height), cropRect, GraphicsUnit.Pixel); } 

Confira este link: http://www.switchonthecode.com/tutorials/csharp-tutorial-image-editing-saving-cropping-and-resizing [< == Link is DEAD]

 private static Image cropImage(Image img, Rectangle cropArea) { Bitmap bmpImage = new Bitmap(img); return bmpImage.Clone(cropArea, bmpImage.PixelFormat); } 

Mais simples que a resposta aceita é esta:

 public static Bitmap cropAtRect(this Bitmap b, Rectangle r) { Bitmap nb = new Bitmap(r.Width, r.Height); Graphics g = Graphics.FromImage(nb); g.DrawImage(b, -rX, -rY); return nb; } 

e evita o risco de exceção ” Sem memory ” da resposta mais simples.

EDIT : Acho que isso é bom com PNGs salvo por Bitmap.Save ou Paint.exe, mas falha com PNGs salvos por exemplo, Paint Shop Pro 6 – o conteúdo é deslocado. A adição de GraphicsUnit.Pixel fornece um resultado errado diferente. Talvez apenas esses PNG com falha estejam com defeito.

use bmp.SetResolution (image.HorizontalResolution, image .VerticalResolution);

isso pode ser necessário para fazer, mesmo se você implementar a melhor resposta aqui, especialmente se a sua imagem é realmente grande e as resoluções não são exatamente 96,0

Meu exemplo de teste:

  static Bitmap LoadImage() { return (Bitmap)Bitmap.FromFile( @"e:\Tests\d_bigImage.bmp" ); // here is large image 9222x9222 pixels and 95.96 dpi resolutions } static void TestBigImagePartDrawing() { using( var absentRectangleImage = LoadImage() ) { using( var currentTile = new Bitmap( 256, 256 ) ) { currentTile.SetResolution(absentRectangleImage.HorizontalResolution, absentRectangleImage.VerticalResolution); using( var currentTileGraphics = Graphics.FromImage( currentTile ) ) { currentTileGraphics.Clear( Color.Black ); var absentRectangleArea = new Rectangle( 3, 8963, 256, 256 ); currentTileGraphics.DrawImage( absentRectangleImage, 0, 0, absentRectangleArea, GraphicsUnit.Pixel ); } currentTile.Save(@"e:\Tests\Tile.bmp"); } } } 

É muito fácil:

  • Crie um novo object Bitmap com o tamanho recortado.
  • Use Graphics.FromImage para criar um object Graphics para o novo bitmap.
  • Use o método DrawImage para desenhar a imagem no bitmap com uma coordenada X e Y negativa.

Se você estiver usando o AForge.NET :

 using(var croppedBitmap = new Crop(new Rectangle(10, 10, 10, 10)).Apply(bitmap)) { // ... } 

Aqui está um exemplo simples de cortar uma imagem

 public Image Crop(string img, int width, int height, int x, int y) { try { Image image = Image.FromFile(img); Bitmap bmp = new Bitmap(width, height, 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, width, height), x, y, width, height, GraphicsUnit.Pixel); // Dispose to free up resources image.Dispose(); bmp.Dispose(); gfx.Dispose(); return bmp; } catch (Exception ex) { MessageBox.Show(ex.Message); return null; } } 

Há um wrapper C # para o que é open source, hospedado no Codeplex chamado Web Image Cropping

Registre o controle

< %@ Register Assembly="CS.Web.UI.CropImage" Namespace="CS.Web.UI" TagPrefix="cs" %>

Redimensionamento

   

Corte no código por trás – método Call Crop quando o botão clicado por exemplo;

wci1.Crop(Server.MapPath("images/sample1.jpg"));

Supondo que você queira levar um arquivo de imagem (JPEG, BMP, TIFF, etc) e cortá-lo, salve-o como um arquivo de imagem menor, sugiro usar uma ferramenta de terceiros que tenha uma API .NET. Aqui estão alguns dos mais populares que eu gosto:

LeadTools
Accusoft Pegasus Snowbound Imaging SDK

Cortar uma imagem é muito fácil em C #. No entanto, fazendo as coisas como você vai gerenciar o corte de sua imagem será um pouco mais difícil.

Amostra abaixo é a maneira como cortar uma imagem em c #.

 var filename = @"c:\personal\images\horizon.png"; var img = Image.FromFile(filename); var rect = new Rectangle(new Point(0, 0), img.Size); var cloned = new Bitmap(img).Clone(rect, img.PixelFormat); var bitmap = new Bitmap(cloned, new Size(50, 50)); cloned.Dispose(); 

Apenas esta amostra funcionando sem problema:

 var crop = new Rectangle(0, y, bitmap.Width, h); var bmp = new Bitmap(bitmap.Width, h); var tempfile = Application.StartupPath+"\\"+"TEMP"+"\\"+Path.GetRandomFileName(); using (var gr = Graphics.FromImage(bmp)) { try { var dest = new Rectangle(0, 0, bitmap.Width, h); gr.DrawImage(image,dest , crop, GraphicsUnit.Point); bmp.Save(tempfile,ImageFormat.Jpeg); bmp.Dispose(); } catch (Exception) { } } 

Esse é outro caminho. No meu caso eu tenho:

  • 2 controles numéricos de updown (chamados LeftMargin e TopMargin)
  • 1 checkbox de imagem (pictureBox1)
  • 1 botão que eu chamei gerar
  • 1 imagem em C: \ imagenes \ myImage.gif

Dentro do botão eu tenho este código:

 Image myImage = Image.FromFile(@"C:\imagenes\myImage.gif"); Bitmap croppedBitmap = new Bitmap(myImage); croppedBitmap = croppedBitmap.Clone( new Rectangle( (int)LeftMargin.Value, (int)TopMargin.Value, myImage.Width - (int)LeftMargin.Value, myImage.Height - (int)TopMargin.Value), System.Drawing.Imaging.PixelFormat.DontCare); pictureBox1.Image = croppedBitmap; 

Eu tentei no Visual Studio 2012 usando c #. Eu encontrei esta solução desta página

aqui está trabalhando demo no github

https://github.com/SystematixIndore/Crop-SaveImageInCSharp

 < %@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebApplication1.WebForm1" %> < !DOCTYPE html>         


Lógica de código C # para upload e recorte.

 using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.IO; using SD = System.Drawing; using System.Drawing.Imaging; using System.Drawing.Drawing2D; namespace WebApplication1 { public partial class WebForm1 : System.Web.UI.Page { String path = HttpContext.Current.Request.PhysicalApplicationPath + "images\\"; protected void Page_Load(object sender, EventArgs e) { } protected void btnUpload_Click(object sender, EventArgs e) { Boolean FileOK = false; Boolean FileSaved = false; if (Upload.HasFile) { Session["WorkingImage"] = Upload.FileName; String FileExtension = Path.GetExtension(Session["WorkingImage"].ToString()).ToLower(); String[] allowedExtensions = { ".png", ".jpeg", ".jpg", ".gif" }; for (int i = 0; i < allowedExtensions.Length; i++) { if (FileExtension == allowedExtensions[i]) { FileOK = true; } } } if (FileOK) { try { Upload.PostedFile.SaveAs(path + Session["WorkingImage"]); FileSaved = true; } catch (Exception ex) { lblError.Text = "File could not be uploaded." + ex.Message.ToString(); lblError.Visible = true; FileSaved = false; } } else { lblError.Text = "Cannot accept files of this type."; lblError.Visible = true; } if (FileSaved) { pnlUpload.Visible = false; pnlCrop.Visible = true; imgCrop.ImageUrl = "images/" + Session["WorkingImage"].ToString(); } } protected void btnCrop_Click(object sender, EventArgs e) { string ImageName = Session["WorkingImage"].ToString(); int w = Convert.ToInt32(W.Value); int h = Convert.ToInt32(H.Value); int x = Convert.ToInt32(X.Value); int y = Convert.ToInt32(Y.Value); byte[] CropImage = Crop(path + ImageName, w, h, x, y); using (MemoryStream ms = new MemoryStream(CropImage, 0, CropImage.Length)) { ms.Write(CropImage, 0, CropImage.Length); using (SD.Image CroppedImage = SD.Image.FromStream(ms, true)) { string SaveTo = path + "crop" + ImageName; CroppedImage.Save(SaveTo, CroppedImage.RawFormat); pnlCrop.Visible = false; pnlCropped.Visible = true; imgCropped.ImageUrl = "images/crop" + ImageName; } } } static byte[] Crop(string Img, int Width, int Height, int X, int Y) { try { using (SD.Image OriginalImage = SD.Image.FromFile(Img)) { using (SD.Bitmap bmp = new SD.Bitmap(Width, Height)) { bmp.SetResolution(OriginalImage.HorizontalResolution, OriginalImage.VerticalResolution); using (SD.Graphics Graphic = SD.Graphics.FromImage(bmp)) { Graphic.SmoothingMode = SmoothingMode.AntiAlias; Graphic.InterpolationMode = InterpolationMode.HighQualityBicubic; Graphic.PixelOffsetMode = PixelOffsetMode.HighQuality; Graphic.DrawImage(OriginalImage, new SD.Rectangle(0, 0, Width, Height), X, Y, Width, Height, SD.GraphicsUnit.Pixel); MemoryStream ms = new MemoryStream(); bmp.Save(ms, OriginalImage.RawFormat); return ms.GetBuffer(); } } } } catch (Exception Ex) { throw (Ex); } } } } 

Eu estava procurando por uma function fácil e rápida, sem nenhuma biblioteca adicional para fazer o trabalho. Eu tentei solução Nicks , mas eu precisava de 29,4 segundos para “extrair” 1195 imagens de um arquivo atlas. Então, mais tarde eu consegui assim e precisei de 2,43 segundos para fazer o mesmo trabalho. Talvez isso seja útil.

 // content of the Texture class public class Texture { //name of the texture public string name { get; set; } //x position of the texture in the atlas image public int x { get; set; } //y position of the texture in the atlas image public int y { get; set; } //width of the texture in the atlas image public int width { get; set; } //height of the texture in the atlas image public int height { get; set; } } Bitmap atlasImage = new Bitmap(@"C:\somepicture.png"); PixelFormat pixelFormat = atlasImage.PixelFormat; foreach (Texture t in textureList) { try { CroppedImage = new Bitmap(t.width, t.height, pixelFormat); // copy pixels over to avoid antialiasing or any other side effects of drawing // the subimages to the output image using Graphics for (int x = 0; x < t.width; x++) for (int y = 0; y < t.height; y++) CroppedImage.SetPixel(x, y, atlasImage.GetPixel(tx + x, ty + y)); CroppedImage.Save(Path.Combine(workingFolder, t.name + ".png"), ImageFormat.Png); } catch (Exception ex) { // handle the exception } }