কোনও গুণমান [বন্ধ] না হারিয়ে কোনও চিত্রের আকার পরিবর্তন করা


108

আমি কীভাবে কোনও চিত্রের আকারটি প্রভাবিত না করে কোনও চিত্রকে আকার দিতে পারি?


আপনি কি আমাদের আরও বিশদ দিতে পারেন? আপনার চিত্রগুলি কত বড় এবং সেগুলির আকারের আপনার কী প্রয়োজন?
মার্ক র্যানসম


6
imageresizing.net - এই লাইব্রেরিটি আপনি NET- র সাথে সর্বাধিক মানের চিত্র পেতে পারে
লিলিথ রিভার

উত্তর:


217

যেমনটি আরসিএআর বলেছে, কিছু গুণ না হারিয়ে আপনি পারবেন না, সি # তে আপনি সবচেয়ে ভাল করতে পারেন:

Bitmap newImage = new Bitmap(newWidth, newHeight);
using (Graphics gr = Graphics.FromImage(newImage))
{
    gr.SmoothingMode = SmoothingMode.HighQuality;
    gr.InterpolationMode = InterpolationMode.HighQualityBicubic;
    gr.PixelOffsetMode = PixelOffsetMode.HighQuality;
    gr.DrawImage(srcImage, new Rectangle(0, 0, newWidth, newHeight));
}

2
আমি এটি যুক্ত করতে পারি (যদি সম্ভব হয়) ব্যবহারকারীর একটি বিটম্যাপ চিত্র দিয়ে শুরু করা উচিত যা বলে, এটির দ্বিগুণ বড় হওয়া দরকার এবং তারপরে স্কেল ডাউন। ফলস্বরূপ চিত্রটি বেশ মসৃণ হওয়া উচিত।
প্রেটজেল

2
জিআর.স্মোথিংমড = স্মুথিংমড Hউইচুয়্যুয়ালিটি আরও ভাল কোড। বর্তমানে হাইকুয়ালিটি এবং অ্যান্টিএলিয়াস একই জিনিস তবে ভবিষ্যতে মাইক্রোসফ্ট নতুন কিছু আবিষ্কার করবে। হাইকুয়ালিটি সর্বদা সর্বোত্তমর জন্য একটি উপনাম হওয়া উচিত।
ইয়াল

4
পদ্ধতি 'সিস্টেম.ড্রেইং.ইম্যাজ.স্যাভ (স্ট্রিং ফাইলের নাম, ইমেজ ফরম্যাট ফর্ম্যাট)' মানের 75 সহ জেপিজি সংরক্ষণ করে The চিত্রটি অস্পষ্ট এবং ক্লায়েন্টের দ্বারা গ্রহণযোগ্য নয়। এর পরিবর্তে মানক সমস্যাটি সেভ (স্ট্রিং ফাইলের নাম, ইমেজকোডেকইনফো এনকোডার, এনকোডারপ্যারামিটারগুলি এনকোডারপ্যারাম) ব্যবহার করে 100 এর কাছাকাছি মানের মান নির্দিষ্ট করা ছিল
রিগা

3
এটি চিত্রের সীমানায় কখনও কখনও নিদর্শনগুলি ফেলে দেয় ...
jjxtra

1
এটি ব্যবহার করার সাথে আমার সীমান্তে শৈল্পিক জিনিস ছিল। কোন মিষ্টি?
গোপীচন্দর

32

আপনি যদি ভেক্টর গ্রাফিক্স না করেন তবে কোনও চিত্রের সম্ভাব্যতা না হারিয়ে কোনও চিত্রের আকার পরিবর্তন করার উপায় নেই।


1
যতক্ষণ না আপনি এটিকে প্রসারিত করছেন ...
ব্লেয়ার কনরাড

আপনি যে কোনো তথ্য হারানো ছাড়া এটি প্রসারিত করতে পারেন, কিন্তু সেখানে আপনি যে ফিল্টারগুলি যা বিভিন্ন ফলাফল দিতে ব্যবহার করতে পারেন বিভিন্ন ধরনের হয় - শূন্য-অর্ডার হোল্ড, কম পাস, ইত্যাদি
আদম Rosenfield

24
private static Image resizeImage(Image imgToResize, Size size)
{
    int sourceWidth = imgToResize.Width;
    int sourceHeight = imgToResize.Height;

    float nPercent = 0;
    float nPercentW = 0;
    float nPercentH = 0;

    nPercentW = ((float)size.Width / (float)sourceWidth);
    nPercentH = ((float)size.Height / (float)sourceHeight);

    if (nPercentH < nPercentW)
        nPercent = nPercentH;
    else
        nPercent = nPercentW;

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

    Bitmap b = new Bitmap(destWidth, destHeight);
    Graphics g = Graphics.FromImage((Image)b);
    g.InterpolationMode = InterpolationMode.HighQualityBicubic;

    g.DrawImage(imgToResize, 0, 0, destWidth, destHeight);
    g.Dispose();

    return (Image)b;
}

থেকে এখানে


এটি কাজ করে, তবে ক্রিস এরিকসোর উত্তরে অভিন্ন মানের প্রত্যাবর্তন করে। আকারটি যদিও ব্যবহৃত হয়েছে তা দেখে ভাল
স্যাম জোন্স

5

আমি বিশ্বাস করি আপনি যা করতে যাচ্ছেন তা হ'ল আপনার চিত্রগুলি "আকার পরিবর্তন / পুনর্নির্মাণ"। এখানে একটি ভাল সাইট যা নির্দেশনা দেয় এবং একটি ইউটিলিটি ক্লাস সরবরাহ করে (এটি আমি ব্যবহার করতে পারি):

http://www.codeproject.com/KB/GDI-plus/imgresizoutperfgdiplus.aspx


3

আপনি যদি আকার পরিবর্তন না করেন, তবে রাস্টার গ্রাফিক্সের সাহায্যে আপনি এটি করতে পারবেন না।

ভাল ফিল্টারিং এবং স্মুথিংয়ের সাহায্যে আপনি যা করতে পারেন তা হ'ল কোনও উল্লেখযোগ্য গুণ না হারিয়ে পুনরায় আকার দেওয়া ।

আপনি চিত্রটির ডিপিআই মেটাডেটাও পরিবর্তন করতে পারেন (এটির কিছু রয়েছে বলে ধরে নেওয়া) যা ঠিক একই পিক্সেল গণনা রাখে, তবে চিত্রের সম্পাদকরা কীভাবে এটি 'রিয়েল-ওয়ার্ল্ড' পরিমাপে ভাববে তা পরিবর্তন করবে।

এবং কেবল সমস্ত ঘাঁটিগুলি কভার করার জন্য, যদি আপনি সত্যিই চিত্রটির ফাইলের আকার এবং প্রকৃত চিত্রের মাত্রা না বোঝাতে চান তবে আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি চিত্রের ডেটার একটি ক্ষতিহীন এনকোডিংয়ের দিকে নজর দিন। এটির জন্য আমার পরামর্শটি হ'ল চিত্রটিকে একটি .png ফাইল হিসাবে পুনর্জীবিত করা (আমি উইন্ডোগুলির চিত্রগুলির জন্য ফ্রি ট্রান্সকোডার হিসাবে পেইন্ট ব্যবহার করতে চাই। চিত্রটিতে লোড করুন, নতুন ফর্ম্যাটের মতো সংরক্ষণ করুন)


3

আপনি কিছু গুণ হারানো ব্যতীত কোনও চিত্রের আকার পরিবর্তন করতে পারবেন না, কেবল কারণ আপনি পিক্সেলের সংখ্যা হ্রাস করছেন।

আকারের ক্লায়েন্টের দিকটি হ্রাস করবেন না, কারণ ব্রাউজারগুলি চিত্রগুলির আকার পরিবর্তন করতে খুব ভাল কাজ করে না।

আপনি যা করতে পারেন তা হ'ল এটি রেন্ডার করার আগে বা ব্যবহারকারী হিসাবে এটি আপলোড করার আগে ক্রমবর্ধমান আকার পরিবর্তন করতে পারে।

এখানে একটি নিবন্ধ এখানে সি # তে এটি করার একটি উপায় ব্যাখ্যা করে: http://www.codeproject.com/KB/GDI-plus/imageresize.aspx


"ব্রাউজারগুলি চিত্রের আকার পরিবর্তন করতে খুব ভাল কাজ করে না" - এটি '08-এ সত্য হতে পারে তবে ভাগ্যক্রমে আমরা এখন এই অঞ্চলে কয়েক মাইল এগিয়ে রয়েছি (পুরানো আই ভার্সনের কারণে ধীরে ধীরে বিলীন হয়ে যাচ্ছে) extent
ক্যামিলো মার্টিন

2

আপনি যদি এই ওপেন সোর্স এএসপি.এনইটি মডিউলটির চিত্রের আকার পরিবর্তন করতে চান কিনা তা দেখুন এখানে একটি লাইভ ডেমো রয়েছে, তাই আপনি নিজেই এটির সাথে গোলমাল করতে পারেন। এটি এমন ফলাফল দেয় যা ফটোশপ আউটপুট থেকে পৃথক হওয়া অসম্ভব (আমার কাছে)। এটিতে অনুরূপ ফাইলের আকারও রয়েছে - এমএস তাদের জেপিইজি এনকোডারটিতে খুব ভাল কাজ করেছে।


ঠিক আছে, জেপিজি তুলনামূলকভাবে সোজা বিন্যাস। গুণমান / ফাইলসাইজের ক্ষেত্রে রেফারেন্স বাস্তবায়নের জন্য আপনি অনেক কিছু করতে পারেন না কারণ শেষ পর্যন্ত এটি জেনেরিক সংকোচনের সাথে কেবল ডিসিটি সহগ হয়।
ক্যামিলো মার্টিন

1

এখানে কিছু আছে, প্রসঙ্গে সচেতন সচেতনতা পুনরায় আকারদান, আপনি এটি ব্যবহার করতে সক্ষম হবেন কিনা তা জানেন না তবে এটি দেখার পক্ষে এটি অবশ্যই নিশ্চিত

একটি দুর্দান্ত ভিডিও ডেমো (এর মধ্যবর্তী দিকে প্রসারিত হওয়া) http://www.youtube.com/watch?v=vIFCV2spKtg

এখানে কিছু কোড থাকতে পারে। http://www.semanticmetadata.net/2007/08/30/content-aware-image-resizing-gpl-implementation/

ওভারকিল কি ছিল? পিক্সেলকে কিছুটা ঝাপসা করার জন্য কিছু বর্ধিত চিত্রের জন্য আপনি প্রয়োগ করতে পারেন এমন কিছু সহজ ফিল্টার রয়েছে, আপনি এটি সন্ধান করতে পারেন।


আমার সন্দেহ হয় এটির মূল প্রশ্নের সাথে কোনও সম্পর্ক নেই তবে আমি এই কৌশলটি পছন্দ করি।
ম্যাট ক্রুকশঙ্ক 21

1

আপনি কি আকার বড়, না আরও ছোট? একটি ছোট% দ্বারা বা 2x, 3x এর মতো বৃহত্তর ফ্যাক্টর দ্বারা? আপনার অ্যাপ্লিকেশনটির গুণমান বলতে কী বোঝ? এবং কোন ধরণের চিত্রগুলি - ফটোগ্রাফ, কঠোর ধারযুক্ত লাইন অঙ্কন, বা কী? আপনার নিজের নিম্ন-স্তরের পিক্সেল গ্রাইন্ডিং কোডটি লিখছেন বা বিদ্যমান লাইব্রেরি (। নেট বা যাই হোক না কেন) দিয়ে যতটা সম্ভব চেষ্টা করার চেষ্টা করছেন?

এই বিষয়টিতে জ্ঞানের একটি বৃহত সংস্থা রয়েছে। মূল ধারণাটি হ'ল অন্তরঙ্গকরণ।

ব্রাউজিংয়ের সুপারিশ:
* http://www.all-in-one.ee/~dersch/interpolator/interpolator.html
* http://www.cambridgeincolour.com/tutorials/image-interpolation.htm
* সি # এর জন্য: https: //secure.codeproject.com/KB/GDI-plus/imageprocessing4.aspx?display=navAll&fid=3657&df=90&mpp=25&noise=3&sort=Position&view=Quick&fr=26&select=629945 * এটি জাভা-নির্দিষ্ট তবে এটি শিক্ষামূলক হতে পারে - http: //today.java.net/pub/a/today/2007/04/03/perils-of-image-getscaledinstance.html


1

এখানে আপনি এই শ্রেণিতে জলছবি কোড যুক্ত করতে পারেন:

public class ImageProcessor
    {
        public Bitmap Resize(Bitmap image, int newWidth, int newHeight, string message)
        {
            try
            {
                Bitmap newImage = new Bitmap(newWidth, Calculations(image.Width, image.Height, newWidth));

                using (Graphics gr = Graphics.FromImage(newImage))
                {
                    gr.SmoothingMode = SmoothingMode.AntiAlias;
                    gr.InterpolationMode = InterpolationMode.HighQualityBicubic;
                    gr.PixelOffsetMode = PixelOffsetMode.HighQuality;
                    gr.DrawImage(image, new Rectangle(0, 0, newImage.Width, newImage.Height));

                    var myBrush = new SolidBrush(Color.FromArgb(70, 205, 205, 205));

                    double diagonal = Math.Sqrt(newImage.Width * newImage.Width + newImage.Height * newImage.Height);

                    Rectangle containerBox = new Rectangle();

                    containerBox.X = (int)(diagonal / 10);
                    float messageLength = (float)(diagonal / message.Length * 1);
                    containerBox.Y = -(int)(messageLength / 1.6);

                    Font stringFont = new Font("verdana", messageLength);

                    StringFormat sf = new StringFormat();

                    float slope = (float)(Math.Atan2(newImage.Height, newImage.Width) * 180 / Math.PI);

                    gr.RotateTransform(slope);
                    gr.DrawString(message, stringFont, myBrush, containerBox, sf);
                    return newImage;
                }
            }
            catch (Exception exc)
            {
                throw exc;
            }
        }

        public int Calculations(decimal w1, decimal h1, int newWidth)
        {
            decimal height = 0;
            decimal ratio = 0;


            if (newWidth < w1)
            {
                ratio = w1 / newWidth;
                height = h1 / ratio;

                return height.To<int>();
            }

            if (w1 < newWidth)
            {
                ratio = newWidth / w1;
                height = h1 * ratio;
                return height.To<int>();
            }

            return height.To<int>();
        }

    }

0

এখানে একটি ফোরাম থ্রেড যা একটি সি # চিত্রের আকার পরিবর্তনকারী কোড নমুনা সরবরাহ করে। আপনি সি # তে পুনরায় মডেলিং করতে জিডি গ্রন্থাগার বাইন্ডারগুলির একটি ব্যবহার করতে পারেন ।

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