Comment rogner une image en utilisant C #?

Comment puis-je écrire une application qui recadrer les images en C #?

    Vous pouvez utiliser Graphics.DrawImage pour dessiner une image recadrée sur l’object graphique à partir d’une image 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); } 

    Consultez ce lien: http://www.switchonthecode.com/tutorials/csharp-tutorial-image-editing-saving-cropping-and-resizing [<== Lien est mort]

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

    Plus simple que la réponse acceptée est la suivante:

     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; } 

    et évite le risque d’exception ” Mémoire insuffisante ” de la réponse la plus simple.

    EDIT : Je trouve que cela fonctionne bien avec les fichiers PNG enregistrés par Bitmap.Save ou Paint.exe, mais échoue avec les fichiers PNG enregistrés par exemple par Paint Shop Pro 6 – le contenu est déplacé. L’ajout de GraphicsUnit.Pixel donne un résultat erroné différent. Peut-être que ces PNG défaillants sont défectueux.

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

    cela peut être nécessaire même si vous implémentez la meilleure réponse ici, surtout si votre image est vraiment grande et que les résolutions ne sont pas exactement 96.0

    Mon exemple de test:

      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"); } } } 

    C’est assez facile:

    • Créez un nouvel object Bitmap avec la taille recadrée.
    • Utilisez Graphics.FromImage pour créer un object Graphics pour le nouveau bitmap.
    • Utilisez la méthode DrawImage pour dessiner l’image sur l’image bitmap avec une coordonnée X et Y négative.

    Si vous utilisez AForge.NET :

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

    Voici un exemple simple de recadrage d’une image

     public Image Crop(ssortingng 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; } } 

    Il y a un wrapper C # pour ce qui est open source, hébergé sur Codeplex appelé Web Image Cropping

    Enregistrez le contrôle

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

    Redimensionnement

       

    Recadrage dans le code derrière – Méthode Crop d’appel lorsque le bouton est cliqué, par exemple;

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

    En supposant que vous vouliez prendre un fichier image (JPEG, BMP, TIFF, etc.) et le rogner puis l’enregistrer sous forme de fichier image plus petit, je vous suggère d’utiliser un outil tiers doté d’une API .NET. Voici quelques-uns des plus populaires que j’aime:

    LeadTools
    SDK Accusoft Pegasus Snowbound Imaging

    Recadrer une image est très facile en C #. Cependant, faire les choses pour gérer le recadrage de votre image sera un peu plus difficile.

    Exemple ci-dessous est la façon de rogner une image en 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(); 

    Seul cet échantillon fonctionne sans problème:

     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) { } } 

    C’est une autre façon. Dans mon cas, j’ai:

    • 2 contrôles numériques mis à jour (appelés LeftMargin et TopMargin)
    • 1 boîte à images (pictureBox1)
    • 1 bouton que j’ai appelé générer
    • 1 image sur C: \ imagenes \ myImage.gif

    A l’intérieur du bouton j’ai ce code:

     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; 

    Je l’ai essayé dans Visual studio 2012 en utilisant C #. J’ai trouvé cette solution à partir de cette page

    ici il travaille démo sur github

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

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


    Logique de code C # pour le téléchargement et le recadrage.

     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 { Ssortingng 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; Ssortingng FileExtension = Path.GetExtension(Session["WorkingImage"].ToSsortingng()).ToLower(); Ssortingng[] 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); } } } } 

    Je cherchais une fonction simple et RAPIDE sans librairie supplémentaire pour faire le travail. J’ai essayé la solution Nicks , mais j’avais besoin de 29,4 secondes pour “extraire” 1195 images d’un fichier Atlas. Donc, plus tard, je me suis débrouillé de cette façon et j’ai eu besoin de 2,43 secondes pour faire le même travail. Peut-être que ce sera utile.

     // content of the Texture class public class Texture { //name of the texture public ssortingng 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 } }