সি # ব্যবহার করে কীভাবে একটি চিত্র ক্রপ করবেন?


239

আমি কীভাবে এমন একটি অ্যাপ্লিকেশন লিখতে পারি যা সি # তে চিত্র কাটাবে?

উত্তর:


228

আপনি Graphics.DrawImageএকটি বিটম্যাপ থেকে গ্রাফিক্স অবজেক্টে ক্রপযুক্ত চিত্র আঁকতে ব্যবহার করতে পারেন ।

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

3
কেবল একটি নোট, অঙ্কন চিত্রের স্বাক্ষর বৈধ নয়। এটি গ্রাফিক্সঅনাইট প্যারামিটারটি হারিয়েছে
নাথান টেলর

2
এছাড়াও দ্বিতীয় যুক্তি হ'ল টার্গেট রেকট, ক্রপ রেক্ট নয়।
axk

8
পদ্ধতি কি ফসলের উদ্দেশ্যে DrawImageUnscaledAndClippedচেয়ে দক্ষ DrawImage?
ইভান কোচুরকিন

270

এই লিঙ্কটি দেখুন: http://www.switchonthecode.com / টিউটোরিয়ালস / সিএসআরপি- টিউটোরিয়াল- চিত্র-সম্পাদনা- সংরক্ষণ- ক্রপিং- এবং- রেকর্ডিং

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

56
সম্মত, তবে মনে রাখবেন যে যদি ক্রপআরিয়া ইমগ সীমানা অতিক্রম করে, এটি একটি "মেমরির বাইরে" ব্যতিক্রম দেয়।
ক্রিসজেজে

1
@ কাভানটিটিটি, আপনি যদি কোনও বড় চিত্রকে ছোট আকারের মধ্যে কাটাতে চান তবে উভয়ই বেশ ধীরে ধীরে।
জেবারার

1
@ ক্রিসজেজে আপনি আরও ব্যাখ্যা করতে পারেন? বা এই ইস্যুটির জন্য একটি কর্মসূচী দিন?
raym0nd

1
@ রায়ম0 এবং আমি অনুমান করছি যে আপনার আয়তক্ষেত্রের মাত্রা চিত্রের চেয়ে বড় নয়
স্টুয়ার্টডটনেট

4
তাদের সাইট ডাউন আছে। সাইট থেকে কোড পেয়েছেন কেউ?
সংগম

55

গৃহীত উত্তরের চেয়ে সহজ হ'ল:

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

এবং এটি " স্মৃতিশক্তি ছাড়িয়ে যায়" এড়িয়ে চলে " সহজ উত্তর ছাড়া ঝুঁকি।

মনে রাখবেন যে, Bitmapএবং Graphicsহয় IDisposableঅত: পর usingক্লজ।

সম্পাদনা : আমি দেখতে পেয়েছি যে এটি Bitmap.Saveপিএনজিগুলি দ্বারা সংরক্ষণ করা হয়েছে বা পেইন্ট.এক্সএই দিয়ে ভাল, তবে পিএনজিগুলি ব্যর্থ হয়েছে যেমন পেইন্ট শপ প্রো 6 - সামগ্রীটি স্থানচ্যুত হয়েছে। সংযোজন GraphicsUnit.Pixelএকটি পৃথক ভুল ফলাফল দেয়। সম্ভবত কেবল এই ব্যর্থ পিএনজিগুলি ত্রুটিযুক্ত।


5
এখানে সেরা উত্তর, এটি উত্তর প্রদান করা উচিত। আমি অন্যান্য সমাধানগুলিতে 'মেমরি আউট' এর অভিজ্ঞতা লাভ করছিলাম। এটি প্রথমবারের মতো কাজ করেছে।
c0d3p03t

আমি বুঝতে পারছি না কেন গ্রাফিক্স ইউনাইট.পিক্সেল যুক্ত করা ভুল ফলাফল দেয় তবে তা অবশ্যই ঘটে।
দোকা

আমার চিত্রগুলি সঠিক আকারের সাথে ক্রপ করছিল তবে ভুল এক্স / ওয়াই পর্যন্ত আমি @ ইন্টেলিদেভের উত্তরে প্রস্তাবিত টার্গেট ইমেজে সেটরেসোলিউশন না বলা পর্যন্ত।
ব্রেন্ট কেলার

7
এই উত্তরটি গ্রাফিক্স অবজেক্টটি ফাঁস করে দেয়।
তাও

2
Bitmapএবং Graphicsহয় IDisposable- একটি যোগ usingদফা
thieben ডেভ

7

ব্যবহার bmp.SetResolution(image.HorizontalResolution, image .VerticalResolution);

আপনি যদি এখানে সর্বোত্তম উত্তরটি প্রয়োগ করেন তবে এটি করার প্রয়োজন হতে পারে বিশেষত যদি আপনার চিত্রটি সত্যই দুর্দান্ত এবং রেজোলিউশনগুলি ঠিক 96.0 নয়

আমার পরীক্ষার উদাহরণ:

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

5

এটি বেশ সহজ:

  • Bitmapক্রপ করা আকার সহ একটি নতুন অবজেক্ট তৈরি করুন ।
  • নতুন বিটম্যাপের জন্য Graphics.FromImageএকটি Graphicsঅবজেক্ট তৈরি করতে ব্যবহার করুন ।
  • DrawImageনেতিবাচক এক্স এবং ওয়াই সমন্বয় সহ চিত্রটি বিটম্যাপে আঁকতে পদ্ধতিটি ব্যবহার করুন ।

5

এখানে একটি চিত্র ক্রপ করার একটি সহজ উদাহরণ

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

5
তিনিই একমাত্র তিনি, যিনি রেজোলিউশনের উল্লেখ করেছেন, উত্স চিত্রটিতে মানক-না-থাকলে রেজোলিউশন থাকলে উপরের সমস্ত পদ্ধতি ব্যর্থ হবে।
নেট_প্রোগ

1
bmp.SetResolution (ইমেজ। হরিজন্টাল রিসোলিউশন, ইমেজ। ভার্টিকাল রেজোলিউশন) ব্যবহার করুন; সমাধান ইস্যু ঠিক করতে।
মরবিয়া

2
ব্যতিক্রম ব্যতীত এটি চিত্র, বিএমপি এবং জিএফএক্স অবজেক্ট ফাঁস করবে। বিবৃতি ব্যবহার করে এমন লোককে কেন গুটিয়ে রাখবেন না?
দারিয়াস কুকিনসকাস


2

আমি কাজটি করার জন্য কোনও অতিরিক্ত লিবারি ছাড়াই একটি সহজ এবং দ্রুততম ফাংশনটির সন্ধান করছিলাম। আমি নিক্সের সমাধানটি চেষ্টা করেছিলাম , তবে একটি এটলাস ফাইলের 1195 চিত্র "এক্সট্রাক্ট" করতে আমার 29,4 সেকেন্ডের দরকার ছিল। সুতরাং পরে আমি এইভাবে পরিচালনা করেছিলাম এবং একই কাজটি করার জন্য 2,43 সেকেন্ডের দরকার ছিল। সম্ভবত এটি সহায়ক হবে।

// 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(t.x + x, t.y + y));
           CroppedImage.Save(Path.Combine(workingFolder, t.name + ".png"), ImageFormat.Png);
     }
     catch (Exception ex)
     {
          // handle the exception
     }
}

1

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();

1

এর জন্য একটি সি # র‌্যাপার রয়েছে যা ওপেন সোর্স, কোডপ্লেক্সে হোস্ট করা ওয়েব ইমেজ ক্রপিং called

নিয়ন্ত্রণ নিবন্ধন করুন

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

আকার পরিবর্তন করা হচ্ছে

<asp:Image ID="Image1" runat="server" ImageUrl="images/328.jpg" />
<cs:CropImage ID="wci1" runat="server" Image="Image1" 
     X="10" Y="10" X2="50" Y2="50" />

পিছনে কোডে ফসল তোলা - কল ফসল পদ্ধতি যখন বোতাম উদাহরণস্বরূপ ক্লিক;

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


0

ধরে নেওয়ার অর্থ এই যে আপনি একটি ইমেজ ফাইল (জেপিইজি, বিএমপি, টিআইএফএফ, ইত্যাদি) নিতে চান এবং এটি ক্রপ করুন তারপরে এটি একটি ছোট চিত্র ফাইল হিসাবে সংরক্ষণ করুন, আমি একটি তৃতীয় পক্ষের সরঞ্জাম ব্যবহার করার পরামর্শ দিচ্ছি যার একটি .NET API রয়েছে। আমি পছন্দ করি এমন কয়েকটি জনপ্রিয় এখানে রয়েছে:

লিডটুলস
অ্যাকসুফ্ট পেগাসাস স্নোবাউন্ড ইমেজিং এসডিকে


0

সমস্যা ছাড়াই কেবল এই নমুনাটি কাজ করছে:

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


    }

}

0

এটি অন্য উপায়। আমার ক্ষেত্রে আমার আছে:

  • 2 সংখ্যার আপডেটডাউন নিয়ন্ত্রণ (লেফটমার্জিন এবং টপমার্গিন নামে পরিচিত)
  • 1 চিত্র বাক্স (ছবিবক্স 1)
  • 1 টি বোতাম যা আমি জেনারেট করেছি
  • সি তে 1 টি চিত্র: \ চিত্রগুলি \ myImage.gif mage

বোতামটির ভিতরে আমার এই কোডটি রয়েছে:

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;

আমি এটি সি # ব্যবহার করে ভিজ্যুয়াল স্টুডিও 2012 এ চেষ্টা করেছি। আমি এই পৃষ্ঠাটি থেকে এই সমাধানটি পেয়েছি


0

এখানে এটি গিথুবে ডেমো কাজ করছে

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

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

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
  <title></title>
 <link href="css/jquery.Jcrop.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3/jquery.min.js"></script>
<script type="text/javascript" src="js/jquery.Jcrop.js"></script>
</head>
<body>
  <form id="form2" runat="server">
  <div>
    <asp:Panel ID="pnlUpload" runat="server">
      <asp:FileUpload ID="Upload" runat="server" />
      <br />
      <asp:Button ID="btnUpload" runat="server" OnClick="btnUpload_Click" Text="Upload" />
      <asp:Label ID="lblError" runat="server" Visible="false" />
    </asp:Panel>
    <asp:Panel ID="pnlCrop" runat="server" Visible="false">
      <asp:Image ID="imgCrop" runat="server" />
      <br />
      <asp:HiddenField ID="X" runat="server" />
      <asp:HiddenField ID="Y" runat="server" />
      <asp:HiddenField ID="W" runat="server" />
      <asp:HiddenField ID="H" runat="server" />
      <asp:Button ID="btnCrop" runat="server" Text="Crop" OnClick="btnCrop_Click" />
    </asp:Panel>
    <asp:Panel ID="pnlCropped" runat="server" Visible="false">
      <asp:Image ID="imgCropped" runat="server" />
    </asp:Panel>
  </div>
  </form>
    <script type="text/javascript">
  jQuery(document).ready(function() {
    jQuery('#imgCrop').Jcrop({
      onSelect: storeCoords
    });
  });

  function storeCoords(c) {
    jQuery('#X').val(c.x);
    jQuery('#Y').val(c.y);
    jQuery('#W').val(c.w);
    jQuery('#H').val(c.h);
  };

</script>
</body>
</html>

সি # কোড লজিক আপলোড এবং শস্য জন্য।

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);
            }
        }
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.