কীভাবে একটি চিত্র সি # র আকার দিন


288

হিসাবে Size, Widthএবং Heightএর Get()বৈশিষ্ট্য হয় System.Drawing.Image;
সি # তে রান-টাইমে আমি কীভাবে কোনও চিত্র অবজেক্টকে আকার দিতে পারি?

এখনই, আমি কেবল এটি Imageব্যবহার করে একটি নতুন তৈরি করছি :

// objImage is the original Image
Bitmap objBitmap = new Bitmap(objImage, new Size(227, 171));

2
সঠিক উপায়ে নয় ... নিম্নমানের প্রবৃদ্ধি ব্যবহার করে এবং নতুন বিটম্যাপ চিত্রের সময়কালের জন্য মূল স্ট্রিমটি তালাবন্ধ অবস্থায় রাখতে পারে ... আপনার নিজের চিত্র পুনরায় আকার দেওয়ার সমাধান করার আগে চিত্রের আকার পরিবর্তনকারী ক্ষতির তালিকাটি পড়ুন
লিলিথ নদী

2
নিষ্পত্তি! ()}} ব্যবহার করে!
স্কট কোটস

8
এই উত্তরগুলি সহায়ক হলে, গৃহীত উত্তর চিহ্নিত করার বিষয়টি বিবেচনা করুন।
জোয়েল

3
কোনও অতিরিক্ত লাইব্রেরি ব্যবহার করার দরকার নেই। মার্ক দ্বারা নীচে পোস্ট কোড পুরোপুরি কার্যকরভাবে কাজ করে।
এলমিউ

9
কে? আমি তার উত্তরটি খুঁজে পেতে ব্যর্থ হয়েছি, তবে 3 টি মন্তব্য রয়েছে যা এটি উল্লেখ করে।
সিনাতর

উত্তর:


490

এটি একটি উচ্চ মানের আকার পরিবর্তন করবে:

/// <summary>
/// Resize the image to the specified width and height.
/// </summary>
/// <param name="image">The image to resize.</param>
/// <param name="width">The width to resize to.</param>
/// <param name="height">The height to resize to.</param>
/// <returns>The resized image.</returns>
public static Bitmap ResizeImage(Image image, int width, int height)
{
    var destRect = new Rectangle(0, 0, width, height);
    var destImage = new Bitmap(width, height);

    destImage.SetResolution(image.HorizontalResolution, image.VerticalResolution);

    using (var graphics = Graphics.FromImage(destImage))
    {
        graphics.CompositingMode = CompositingMode.SourceCopy;
        graphics.CompositingQuality = CompositingQuality.HighQuality;
        graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
        graphics.SmoothingMode = SmoothingMode.HighQuality;
        graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;

        using (var wrapMode = new ImageAttributes())
        {
            wrapMode.SetWrapMode(WrapMode.TileFlipXY);
            graphics.DrawImage(image, destRect, 0, 0, image.Width,image.Height, GraphicsUnit.Pixel, wrapMode);
        }
    }

    return destImage;
}
  • wrapMode.SetWrapMode(WrapMode.TileFlipXY) চিত্রের সীমানাগুলির চারপাশে ঘোস্টিং প্রতিরোধ করে - নির্বাক আকার পরিবর্তনকরণ চিত্রের সীমানা ছাড়িয়ে স্বচ্ছ পিক্সেলের নমুনা দেবে, তবে চিত্রটি মিরর করে আমরা আরও ভাল নমুনা পেতে পারি (এই সেটিংটি খুব লক্ষণীয়)
  • destImage.SetResolution শারীরিক আকার নির্বিশেষে ডিপিআই বজায় রাখে - চিত্রের মাত্রা হ্রাস করার সময় বা মুদ্রণের সময় গুণমান বাড়তে পারে
  • পিক্সেল কীভাবে পটভূমিতে মিশ্রিত হয় তা নিয়ন্ত্রণ করে - কারণ আমরা কেবল একটি জিনিস আঁকছি might
    • graphics.CompositingModeউত্স চিত্র থেকে পিক্সেল ওভাররাইট করা হয় বা ব্যাকগ্রাউন্ড পিক্সেলের সাথে একত্রিত করা হয় তা নির্ধারণ করে। SourceCopyনির্দিষ্ট করে যে কোনও রঙ যখন রেন্ডার করা হয় তখন এটি পটভূমির রঙকে ওভাররাইট করে।
    • graphics.CompositingQuality স্তরযুক্ত চিত্রগুলির রেন্ডারিং মানের স্তর নির্ধারণ করে।
  • graphics.InterpolationMode দুটি প্রান্তের মধ্যে মধ্যবর্তী মান গণনা করা হয় তা নির্ধারণ করে
  • graphics.SmoothingMode রেখা, বক্ররেখা এবং ভরাট অঞ্চলের প্রান্তগুলি স্মুথিং ব্যবহার করে কিনা তা সুনির্দিষ্ট করে (এন্টিয়ালিজিংও বলা হয়) - সম্ভবত কেবল ভেক্টরগুলিতেই কাজ করে
  • graphics.PixelOffsetMode নতুন চিত্র অঙ্কনের সময় রেন্ডারিং গুণমানকে প্রভাবিত করে

দিক অনুপাত বজায় রাখা পাঠকের জন্য অনুশীলন হিসাবে বাকী রয়েছে (আসলে, আমি কেবল এটি মনে করি না যে এটি আপনার জন্য এটি করা এই ফাংশনের কাজ)।

এছাড়াও, এটি একটি ভাল নিবন্ধ যা চিত্র পুনরায় আকার দেওয়ার সাথে কিছু সমস্যাগুলি বর্ণনা করে। উপরের ফাংশনটি তাদের বেশিরভাগটিকে কভার করবে তবে আপনার এখনও সংরক্ষণের বিষয়ে চিন্তা করতে হবে ।


4
চিত্রটি পুনরায় আকার দেওয়ার সময় কোডটি নিখুঁতভাবে কাজ করেছিল তবে আকারটি 66 কেবি থেকে 132 কেবি বাড়িয়েছে।
ছিঃ

3
@ চামারা সম্ভবত এটি আপনার চয়ন করা গুণমান সংরক্ষণ করার কারণে রয়েছে। দেখুন msdn.microsoft.com/en-us/library/bb882583(v=vs.110).aspx চেষ্টা মানের = 90
mpen

3
@ কেস্টাবগুলি আপনি নিশ্চিত Bitmapমূলত ক্লাসের নাম, আপনি নিজের পছন্দ মতো ফাইল টাইপ করে সংরক্ষণ করতে পারেন।
এমপেন

5
@ ডটনেট ব্ল্যাকবেল্ট আপনার সম্ভবত একটি রেফারেন্স যুক্ত করতে হবে System.Drawingএবং যোগ করতে হবেusing System.Drawing.Imaging;
মেপেন

2
এটি মূল দিক অনুপাত ঠিক রাখবে না?
ক্যাস্পার স্কভ

148

এটি সম্পর্কে কী কঠিন তা নিশ্চিত নন, আপনি যা করছেন তা করুন, পুনরায় আকারের চিত্র তৈরি করতে অতিরিক্ত লোড বিটম্যাপ কনস্ট্রাক্টরটি ব্যবহার করুন, আপনি যে একমাত্র জিনিসটি হারিয়েছিলেন তা হ'ল চিত্র ডেটা টাইপটিতে ফিরে আসা:

    public static Image resizeImage(Image imgToResize, Size size)
    {
       return (Image)(new Bitmap(imgToResize, size));
    }

    yourImage = resizeImage(yourImage, new Size(50,50));

2
yourImageনতুন চিত্রটিতে এটি নির্ধারণের আগে আপনার নিষ্পত্তি করা উচিত নয় ?
নিক শ

3
আপনি এটি ম্যানুয়ালি নিষ্পত্তি করতে পারেন বা আবর্জনা সংগ্রহকারীকে এটি কাজ করতে দিতে পারেন। কোনো ব্যাপার না.
এলমিউ

23
এই কোডটি পুনরায় আকার দেওয়ার মানটির উপরে কোনও নিয়ন্ত্রণ দেয় না যা খুব গুরুত্বপূর্ণ। মার্কের উত্তরটি দেখুন।
এলমিউ

43

মধ্যে এই প্রশ্ন , আপনি খনি সহ কিছু উত্তর, থাকবে না:

public Image resizeImage(int newWidth, int newHeight, string stPhotoPath)
 {
     Image imgPhoto = Image.FromFile(stPhotoPath); 

     int sourceWidth = imgPhoto.Width;
     int sourceHeight = imgPhoto.Height;

     //Consider vertical pics
    if (sourceWidth < sourceHeight)
    {
        int buff = newWidth;

        newWidth = newHeight;
        newHeight = buff;
    }

    int sourceX = 0, sourceY = 0, destX = 0, destY = 0;
    float nPercent = 0, nPercentW = 0, nPercentH = 0;

    nPercentW = ((float)newWidth / (float)sourceWidth);
    nPercentH = ((float)newHeight / (float)sourceHeight);
    if (nPercentH < nPercentW)
    {
        nPercent = nPercentH;
        destX = System.Convert.ToInt16((newWidth -
                  (sourceWidth * nPercent)) / 2);
    }
    else
    {
        nPercent = nPercentW;
        destY = System.Convert.ToInt16((newHeight -
                  (sourceHeight * nPercent)) / 2);
    }

    int destWidth = (int)(sourceWidth * nPercent);
    int destHeight = (int)(sourceHeight * nPercent);


    Bitmap bmPhoto = new Bitmap(newWidth, newHeight,
                  PixelFormat.Format24bppRgb);

    bmPhoto.SetResolution(imgPhoto.HorizontalResolution,
                 imgPhoto.VerticalResolution);

    Graphics grPhoto = Graphics.FromImage(bmPhoto);
    grPhoto.Clear(Color.Black);
    grPhoto.InterpolationMode =
        System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;

    grPhoto.DrawImage(imgPhoto,
        new Rectangle(destX, destY, destWidth, destHeight),
        new Rectangle(sourceX, sourceY, sourceWidth, sourceHeight),
        GraphicsUnit.Pixel);

    grPhoto.Dispose();
    imgPhoto.Dispose();
    return bmPhoto;
}

5
আপনি imgPhoto.Dispose () ভুলে গেছেন; ফাইলটি ব্যবহারে রাখা হয়েছে
shrrutiet

1
এটি খুব সহায়ক, এবং আমি এটি আমার অ্যাপ্লিকেশনটিতে ব্যবহার করছি। তবে এটি লক্ষণীয় গুরুত্বপূর্ণ যে এই অ্যালগরিদমটি স্বচ্ছ চিত্রগুলির সাথে কাজ করে না .. এটি সমস্ত স্বচ্ছ পিক্সেলকে কালোতে পরিণত করে। এটি সম্ভবত সমাধান করা সহজ তবে এটি ব্যবহারকারীদের জন্য কেবল একটি নোট। :)
মেমে

1
আপনি কি ছবিটি সংরক্ষণ করার কথা মনে করছেন না? imgPhoto.Save ()?
হুইপল্যাশ

@meme আপনি কীভাবে স্বচ্ছ ডকটির জন্য সেই কালো ব্যাকগ্রাউন্ডটি ঠিক করবেন তার লিঙ্ক দিতে পারেন।
সৈয়দ মোহাম্মদ

25

System.Drawing.Image.GetThumbnailImageপদ্ধতিটি ব্যবহার করবেন না কেন ?

public Image GetThumbnailImage(
    int thumbWidth, 
    int thumbHeight, 
    Image.GetThumbnailImageAbort callback, 
    IntPtr callbackData)

উদাহরণ:

Image originalImage = System.Drawing.Image.FromStream(inputStream, true, true);
Image resizedImage = originalImage.GetThumbnailImage(newWidth, (newWidth * originalImage.Height) / originalWidth, null, IntPtr.Zero);
resizedImage.Save(imagePath, ImageFormat.Png);

সূত্র: http://msdn.microsoft.com/en-us/library/system.drawing.image.getthumbnailimage.aspx


6
এটি কোনও চিত্রের আকার পরিবর্তন করার সঠিক উপায় নয়। এটি উপস্থিত থাকলে jpg থেকে একটি থাম্বনেইল টান। যদি এটি বিদ্যমান না থাকে তবে মান বা নতুন চিত্রের উপরে আপনার কোনও নিয়ন্ত্রণ নেই। এছাড়াও, এই কোডটি যেমন রয়েছে তেমন মেমরি ফাঁস হয়।
রবার্ট স্মিথ

1
@ بابরোট কেন এই কারণে মেমরি ফাঁস হবে?
ব্যবহারকারী

2
জিডিআই লাইব্রেরির যে কোনও কিছুই এখনও পরিচালনা ছাড়াই চলছে। কোনও বিবৃতি ব্যবহার না করে বা তারপরে বস্তুগুলি নিষ্পত্তি না করে সিস্টেমটিকে আবর্জনা সংগ্রহ করতে এবং স্মৃতিটিকে আবার উপলভ্য করতে দীর্ঘ সময় নিতে পারে।
রবার্ট স্মিথ

9
আপনি যেমনটি বলেছেন: এটি একটি দীর্ঘ সময় নিতে পারে। তবে এটি কোনও স্মৃতি ফাঁস নয়। এটি মেমরি ফাঁস হবে যদি মেমরিটি কখনও মুক্তি না পেত। তবে আবর্জনা সংগ্রাহকের এটি সাধারণ আচরণ যা সিপিইউ অলস অবস্থায় থাকে তা মেমরি মুক্ত করে। () স্টেটমেন্ট ব্যবহার করে মেমরি ফাঁস প্রতিরোধ করে না। এটি ঠিক সঙ্গে সঙ্গে মেমরিটি মুক্ত করে the এই নির্দিষ্ট ক্ষেত্রে একমাত্র পার্থক্য।
এলমেউ

ইমেজ মাপ পরিবর্তনকারী এর ফাঁদ দেখুন: nathanaeljones.com/blog/2009/20-image-resizing-pitfalls "GetThumbnailImage () ব্যবহার GetThumbnailImage () সুস্পষ্ট পছন্দ বলে মনে হয়, এবং অনেক নিবন্ধে তার ব্যবহার সুপারিশ দুর্ভাগ্যবশত, এটা সবসময় grabs এমবেডেড JPEG।। থাম্বনেইল উপস্থিত থাকলে কিছু ফটোগুলি এগুলি থাকে, কিছু থাকে না - এটি সাধারণত আপনার ক্যামেরার উপর নির্ভর করে Get আপনি কেন ভাববেন যে গেটথম্বনাইল আইমেজ কিছু ফটোতে ভাল কাজ করে, তবে অন্যদের উপর ভয়াবহভাবে ঝাপসা হয় Get গেটথম্বনেল ইমেজ () বড় ফটোগুলির জন্য নির্ভরযোগ্য নয় যে কারণে 10px বাই 10px এর চেয়ে বেশি। "
নিক পেইন্টার 21

12

আপনি নেট-ভিআইপি চেষ্টা করতে পারেন , সিবি # libvips জন্য বাঁধাই । এটি একটি অলস, স্ট্রিমিং, চাহিদা-চালিত ইমেজ প্রসেসিং লাইব্রেরি, তাই এটি পুরো চিত্রটি লোড করার প্রয়োজন ছাড়াই এভাবে কাজ করতে পারে।

উদাহরণস্বরূপ, এটি একটি সহজ চিত্র থাম্বনেলার ​​সহ আসে:

Image image = Image.Thumbnail("image.jpg", 300, 300);
image.WriteToFile("my-thumbnail.jpg");

এটি স্মার্ট ক্রপকেও সমর্থন করে, যা চিত্রের সবচেয়ে গুরুত্বপূর্ণ অংশটি বুদ্ধিমানের সাথে নির্ধারণ করার এবং চিত্রটি ক্রপ করার সময় এটি ফোকাসে রাখার একটি উপায়। উদাহরণ স্বরূপ:

Image image = Image.Thumbnail("owl.jpg", 128, crop: "attention");
image.WriteToFile("tn_owl.jpg");

owl.jpgঅফ-সেন্টার রচনাটি কোথায় :

পেঁচা

এই ফলাফল দেয়:

আউল স্মার্ট ফসল

প্রথমে 128 পিক্সেলের উল্লম্ব অক্ষটি পেতে ইমেজটি সঙ্কুচিত করে, তারপরে attentionকৌশলটি ব্যবহার করে 128 পিক্সেলে নেমে আসে । এইটি এমন বৈশিষ্ট্যগুলির জন্য চিত্রটি সন্ধান করে যা সম্ভবত একটি মানুষের চোখকে ধরে ফেলতে পারে, বিশদর Smartcrop()জন্য দেখুন।


আপনার libvips জন্য বাঁধাই দুর্দান্ত মনে হচ্ছে। আমি অবশ্যই আপনার লিবিতে একবার দেখে নেব। এটি সি # বিকাশকারীকে উপলভ্য করার জন্য ধন্যবাদ!
ফ্রেঞ্চটাস্টিক

এটি দুর্দান্ত! কোনও চিত্র প্রসেসিং লাইব্রেরিটি এটি দেখতে ভাল লাগবে আমার কোনও ধারণা ছিল না।
ডালভীর

চমৎকার! ইমেজম্যাগিকের চেয়ে ভারী
মোশে এল

10

এটা হবে -

  • লুপের প্রয়োজন ছাড়াই প্রস্থ এবং উচ্চতার আকার পরিবর্তন করুন
  • চিত্রগুলির মূল মাত্রা অতিক্রম করে না

//////////////

private void ResizeImage(Image img, double maxWidth, double maxHeight)
{
    double resizeWidth = img.Source.Width;
    double resizeHeight = img.Source.Height;

    double aspect = resizeWidth / resizeHeight;

    if (resizeWidth > maxWidth)
    {
        resizeWidth = maxWidth;
        resizeHeight = resizeWidth / aspect;
    }
    if (resizeHeight > maxHeight)
    {
        aspect = resizeWidth / resizeHeight;
        resizeHeight = maxHeight;
        resizeWidth = resizeHeight * aspect;
    }

    img.Width = resizeWidth;
    img.Height = resizeHeight;
}

11
ওপি সিস্টেম.ড্রেইংয়ের বিষয়ে জিজ্ঞাসা করেছিল mage চিত্র, যেখানে আপনার কোডটি 'প্রস্থ' এবং 'উচ্চতা' বৈশিষ্ট্যগুলি স্থিরযোগ্য নয় বলে কাজ করবে না। এটি অবশ্য System.Windows.Controls.I छवि এর জন্য কাজ করবে।
মিম্মড্রেডগ

10
public static Image resizeImage(Image image, int new_height, int new_width)
{
    Bitmap new_image = new Bitmap(new_width, new_height);
    Graphics g = Graphics.FromImage((Image)new_image );
    g.InterpolationMode = InterpolationMode.High;
    g.DrawImage(image, 0, 0, new_width, new_height);
    return new_image;
}

আপনি গ্রাফিক্স নিষ্পত্তি করতে ভুলে গেছেন। নতুন বিটম্যাপ (চিত্র, প্রস্থ, উচ্চতা) এর মতো আরও ভাল ইন্টারপোলেশন মোডের মতো একই নীতি মনে হয় । আমি কৌতূহল করছি ডিফল্ট কি ? এর চেয়েও খারাপ কি Low?
সিনাতর

9

এই কোডটি উপরের উত্তরগুলির মধ্য থেকে পোস্ট করা সমান .. তবে স্বচ্ছ পিক্সেলকে কালো রঙের পরিবর্তে সাদা রূপান্তর করবে ... ধন্যবাদ :)

    public Image resizeImage(int newWidth, int newHeight, string stPhotoPath)
    {
        Image imgPhoto = Image.FromFile(stPhotoPath);

        int sourceWidth = imgPhoto.Width;
        int sourceHeight = imgPhoto.Height;

        //Consider vertical pics
        if (sourceWidth < sourceHeight)
        {
            int buff = newWidth;

            newWidth = newHeight;
            newHeight = buff;
        }

        int sourceX = 0, sourceY = 0, destX = 0, destY = 0;
        float nPercent = 0, nPercentW = 0, nPercentH = 0;

        nPercentW = ((float)newWidth / (float)sourceWidth);
        nPercentH = ((float)newHeight / (float)sourceHeight);
        if (nPercentH < nPercentW)
        {
            nPercent = nPercentH;
            destX = System.Convert.ToInt16((newWidth -
                      (sourceWidth * nPercent)) / 2);
        }
        else
        {
            nPercent = nPercentW;
            destY = System.Convert.ToInt16((newHeight -
                      (sourceHeight * nPercent)) / 2);
        }

        int destWidth = (int)(sourceWidth * nPercent);
        int destHeight = (int)(sourceHeight * nPercent);


        Bitmap bmPhoto = new Bitmap(newWidth, newHeight,
                      PixelFormat.Format24bppRgb);

        bmPhoto.SetResolution(imgPhoto.HorizontalResolution,
                     imgPhoto.VerticalResolution);

        Graphics grPhoto = Graphics.FromImage(bmPhoto);
        grPhoto.Clear(Color.White);
        grPhoto.InterpolationMode =
            System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;

        grPhoto.DrawImage(imgPhoto,
            new Rectangle(destX, destY, destWidth, destHeight),
            new Rectangle(sourceX, sourceY, sourceWidth, sourceHeight),
            GraphicsUnit.Pixel);

        grPhoto.Dispose();
        imgPhoto.Dispose();

        return bmPhoto;
    }

7

অ্যাপ্লিকেশনটিতে আমি এটি করেছি যে একাধিক বিকল্পের সাথে একটি ফাংশন তৈরি করা দরকার। এটি বেশ বড়, তবে এটি চিত্রটির আকার পরিবর্তন করে, অনুপাতের অনুপাত রাখতে পারে এবং কেবল চিত্রটির কেন্দ্রস্থলে ফিরে আসতে প্রান্তগুলি কেটে ফেলতে পারে:

/// <summary>
    /// Resize image with a directory as source
    /// </summary>
    /// <param name="OriginalFileLocation">Image location</param>
    /// <param name="heigth">new height</param>
    /// <param name="width">new width</param>
    /// <param name="keepAspectRatio">keep the aspect ratio</param>
    /// <param name="getCenter">return the center bit of the image</param>
    /// <returns>image with new dimentions</returns>
    public Image resizeImageFromFile(String OriginalFileLocation, int heigth, int width, Boolean keepAspectRatio, Boolean getCenter)
    {
        int newheigth = heigth;
        System.Drawing.Image FullsizeImage = System.Drawing.Image.FromFile(OriginalFileLocation);

        // Prevent using images internal thumbnail
        FullsizeImage.RotateFlip(System.Drawing.RotateFlipType.Rotate180FlipNone);
        FullsizeImage.RotateFlip(System.Drawing.RotateFlipType.Rotate180FlipNone);

        if (keepAspectRatio || getCenter)
        {
            int bmpY = 0;
            double resize = (double)FullsizeImage.Width / (double)width;//get the resize vector
            if (getCenter)
            {
                bmpY = (int)((FullsizeImage.Height - (heigth * resize)) / 2);// gives the Y value of the part that will be cut off, to show only the part in the center
                Rectangle section = new Rectangle(new Point(0, bmpY), new Size(FullsizeImage.Width, (int)(heigth * resize)));// create the section to cut of the original image
                //System.Console.WriteLine("the section that will be cut off: " + section.Size.ToString() + " the Y value is minimized by: " + bmpY);
                Bitmap orImg = new Bitmap((Bitmap)FullsizeImage);//for the correct effect convert image to bitmap.
                FullsizeImage.Dispose();//clear the original image
                using (Bitmap tempImg = new Bitmap(section.Width, section.Height))
                {
                    Graphics cutImg = Graphics.FromImage(tempImg);//              set the file to save the new image to.
                    cutImg.DrawImage(orImg, 0, 0, section, GraphicsUnit.Pixel);// cut the image and save it to tempImg
                    FullsizeImage = tempImg;//save the tempImg as FullsizeImage for resizing later
                    orImg.Dispose();
                    cutImg.Dispose();
                    return FullsizeImage.GetThumbnailImage(width, heigth, null, IntPtr.Zero);
                }
            }
            else newheigth = (int)(FullsizeImage.Height / resize);//  set the new heigth of the current image
        }//return the image resized to the given heigth and width
        return FullsizeImage.GetThumbnailImage(width, newheigth, null, IntPtr.Zero);
    }

ফাংশনটি অ্যাক্সেস করা সহজ করার জন্য কয়েকটি অতিরিক্ত লোড ফাংশন যুক্ত করা সম্ভব:

/// <summary>
    /// Resize image with a directory as source
    /// </summary>
    /// <param name="OriginalFileLocation">Image location</param>
    /// <param name="heigth">new height</param>
    /// <param name="width">new width</param>
    /// <returns>image with new dimentions</returns>
    public Image resizeImageFromFile(String OriginalFileLocation, int heigth, int width)
    {
        return resizeImageFromFile(OriginalFileLocation, heigth, width, false, false);
    }

    /// <summary>
    /// Resize image with a directory as source
    /// </summary>
    /// <param name="OriginalFileLocation">Image location</param>
    /// <param name="heigth">new height</param>
    /// <param name="width">new width</param>
    /// <param name="keepAspectRatio">keep the aspect ratio</param>
    /// <returns>image with new dimentions</returns>
    public Image resizeImageFromFile(String OriginalFileLocation, int heigth, int width, Boolean keepAspectRatio)
    {
        return resizeImageFromFile(OriginalFileLocation, heigth, width, keepAspectRatio, false);
    }

এখন সেট দুটি শেষ booচ্ছিক। ফাংশনটি এভাবে কল করুন:

System.Drawing.Image ResizedImage = resizeImageFromFile(imageLocation, 800, 400, true, true);

6
public string CreateThumbnail(int maxWidth, int maxHeight, string path)
{

    var image = System.Drawing.Image.FromFile(path);
    var ratioX = (double)maxWidth / image.Width;
    var ratioY = (double)maxHeight / image.Height;
    var ratio = Math.Min(ratioX, ratioY);
    var newWidth = (int)(image.Width * ratio);
    var newHeight = (int)(image.Height * ratio);
    var newImage = new Bitmap(newWidth, newHeight);
    Graphics thumbGraph = Graphics.FromImage(newImage);

    thumbGraph.CompositingQuality = CompositingQuality.HighQuality;
    thumbGraph.SmoothingMode = SmoothingMode.HighQuality;
    //thumbGraph.InterpolationMode = InterpolationMode.HighQualityBicubic;

    thumbGraph.DrawImage(image, 0, 0, newWidth, newHeight);
    image.Dispose();

    string fileRelativePath = "newsizeimages/" + maxWidth + Path.GetFileName(path);
    newImage.Save(Server.MapPath(fileRelativePath), newImage.RawFormat);
    return fileRelativePath;
}

এখানে ক্লিক করুন http://bhupendrasinghsaini.blogspot.in/2014/07/resize-image-in-c.html


6

এটি একটি কোড যা আমি একটি নির্দিষ্ট প্রয়োজনের জন্য কাজ করেছিলাম যেমন: গন্তব্যটি সর্বদা ল্যান্ডস্কেপ অনুপাতে থাকে। এটি আপনাকে একটি ভাল সূচনা দেওয়া উচিত।

public Image ResizeImage(Image source, RectangleF destinationBounds)
{
    RectangleF sourceBounds = new RectangleF(0.0f,0.0f,(float)source.Width, (float)source.Height);
    RectangleF scaleBounds = new RectangleF();

    Image destinationImage = new Bitmap((int)destinationBounds.Width, (int)destinationBounds.Height);
    Graphics graph = Graphics.FromImage(destinationImage);
    graph.InterpolationMode =
        System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;

    // Fill with background color
    graph.FillRectangle(new SolidBrush(System.Drawing.Color.White), destinationBounds);

    float resizeRatio, sourceRatio;
    float scaleWidth, scaleHeight;

    sourceRatio = (float)source.Width / (float)source.Height;

    if (sourceRatio >= 1.0f)
    {
        //landscape
        resizeRatio = destinationBounds.Width / sourceBounds.Width;
        scaleWidth = destinationBounds.Width;
        scaleHeight = sourceBounds.Height * resizeRatio;
        float trimValue = destinationBounds.Height - scaleHeight;
        graph.DrawImage(source, 0, (trimValue / 2), destinationBounds.Width, scaleHeight);
    }
    else
    {
        //portrait
        resizeRatio = destinationBounds.Height/sourceBounds.Height;
        scaleWidth = sourceBounds.Width * resizeRatio;
        scaleHeight = destinationBounds.Height;
        float trimValue = destinationBounds.Width - scaleWidth;
        graph.DrawImage(source, (trimValue / 2), 0, scaleWidth, destinationBounds.Height);
    }

    return destinationImage;

}

অসাধারণ!!! আমি একটি প্রতিকৃতি চিত্রটিতে সমস্যায় পড়েছিলাম এবং ওয়েবে অনেকগুলি সমাধানের চেষ্টা করার পরে, এটি কেবলমাত্র পারফেক্ট ছিল! তোমাকে অনেক ধন্যবাদ!
ফ্যাবিও

3

আপনি যদি এটির সাথে কাজ করছেন BitmapSource:

var resizedBitmap = new TransformedBitmap(
    bitmapSource,
    new ScaleTransform(scaleX, scaleY));

আপনি যদি মানের উপর আরও ভাল নিয়ন্ত্রণ চান তবে প্রথমে এটি চালান:

RenderOptions.SetBitmapScalingMode(
    bitmapSource,
    BitmapScalingMode.HighQuality);

(ডিফল্ট BitmapScalingMode.Linearযা সমান BitmapScalingMode.LowQuality।)


3

আমি ইমেজপ্রসেসর কোর ব্যবহার করি, বেশিরভাগ কারণ এটি কাজ করে et নেট কোর।

এবং এর মধ্যে আরও বিকল্প রয়েছে যেমন রূপান্তরকরণের ধরন, চিত্র কাটা এবং আরও অনেক কিছু

http://imageprocessor.org/imageprocessor/


1
আমি দেখেছি এবং এটি। নেট কোর সমর্থন করে না। এটি পুরো কাঠামোর বিপরীতে নির্মিত।
ক্রিসড্রোবিসন

1

ক্যানভাসের চিত্র আনুপাতিক রাখার মতো প্রস্থ এবং উচ্চতার নিচে ফিট করতে একটি চিত্রকে পুনরায় আকার দিন এবং সংরক্ষণ করুন

using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.IO;

namespace Infra.Files
{
    public static class GenerateThumb
    {
        /// <summary>
        /// Resize and save an image to fit under width and height like a canvas keeping things proportional
        /// </summary>
        /// <param name="originalImagePath"></param>
        /// <param name="thumbImagePath"></param>
        /// <param name="newWidth"></param>
        /// <param name="newHeight"></param>
        public static void GenerateThumbImage(string originalImagePath, string thumbImagePath, int newWidth, int newHeight)
        {
            Bitmap srcBmp = new Bitmap(originalImagePath);
            float ratio = 1;
            float minSize = Math.Min(newHeight, newHeight);

            if (srcBmp.Width > srcBmp.Height)
            {
                ratio = minSize / (float)srcBmp.Width;
            }
            else
            {
                ratio = minSize / (float)srcBmp.Height;
            }

            SizeF newSize = new SizeF(srcBmp.Width * ratio, srcBmp.Height * ratio);
            Bitmap target = new Bitmap((int)newSize.Width, (int)newSize.Height);

            using (Graphics graphics = Graphics.FromImage(target))
            {
                graphics.CompositingQuality = CompositingQuality.HighSpeed;
                graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
                graphics.CompositingMode = CompositingMode.SourceCopy;
                graphics.DrawImage(srcBmp, 0, 0, newSize.Width, newSize.Height);

                using (MemoryStream memoryStream = new MemoryStream())
                {
                    target.Save(thumbImagePath);
                }
            }
        }
    }
}

1

চিত্রের আকার পরিবর্তন করার জন্য নীচে উদাহরণ সহ ফাংশনটি ব্যবহার করুন:

//Example : 
System.Net.Mime.MediaTypeNames.Image newImage = System.Net.Mime.MediaTypeNames.Image.FromFile("SampImag.jpg");
System.Net.Mime.MediaTypeNames.Image temImag = FormatImage(newImage, 100, 100);

//image size modification unction   
public static System.Net.Mime.MediaTypeNames.Image FormatImage(System.Net.Mime.MediaTypeNames.Image img, int outputWidth, int outputHeight)
{

    Bitmap outputImage = null;
    Graphics graphics = null;
    try
    {
         outputImage = new Bitmap(outputWidth, outputHeight, System.Drawing.Imaging.PixelFormat.Format16bppRgb555);
         graphics = Graphics.FromImage(outputImage);
         graphics.DrawImage(img, new Rectangle(0, 0, outputWidth, outputHeight),
         new Rectangle(0, 0, img.Width, img.Height), GraphicsUnit.Pixel);

         return outputImage;
     }
     catch (Exception ex)
     {
           return img;
     }
}

2
এই কোডটি কীভাবে ব্যবহার করবেন, কোডটি কী করে এবং কীভাবে এটি মূল প্রশ্নে সমস্যার সমাধান করে তা উপরে আপনার উত্তরে দয়া করে ব্যাখ্যা করার জন্য দয়া করে বিবেচনা করুন।
টিম ভিসি

আমি ব্যবহারের ক্ষেত্রেও যুক্ত করেছি। উপরোক্ত কার্যকারিতা সহ নম্র উদাহরণ ব্যবহার করুন। চিত্র newImage = চিত্র.ফ্রোমফাইল ("SampImag.jpg"); চিত্র temImag = ফর্ম্যাটআইমেজ (নতুন চিত্র, 100, 100);
প্রসাদ কেএম


0

দ্রষ্টব্য: এটি এএসপি.নেট কোরের সাথে কাজ করবে না কারণ ওয়েবআইমেজ System.Web এর উপর নির্ভর করে, তবে এএসপি-নেট এর আগের সংস্করণগুলিতে আমি এই স্নিপেটটি বহুবার ব্যবহার করেছি এবং দরকারী ছিল।

String ThumbfullPath = Path.GetFileNameWithoutExtension(file.FileName) + "80x80.jpg";
var ThumbfullPath2 = Path.Combine(ThumbfullPath, fileThumb);
using (MemoryStream stream = new MemoryStream(System.IO.File.ReadAllBytes(fullPath)))
{
      var thumbnail = new WebImage(stream).Resize(80, 80);
      thumbnail.Save(ThumbfullPath2, "jpg");
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.