আমি কীভাবে কোনও চিত্রের আকারটি প্রভাবিত না করে কোনও চিত্রকে আকার দিতে পারি?
আমি কীভাবে কোনও চিত্রের আকারটি প্রভাবিত না করে কোনও চিত্রকে আকার দিতে পারি?
উত্তর:
যেমনটি আরসিএআর বলেছে, কিছু গুণ না হারিয়ে আপনি পারবেন না, সি # তে আপনি সবচেয়ে ভাল করতে পারেন:
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));
}
আপনি যদি ভেক্টর গ্রাফিক্স না করেন তবে কোনও চিত্রের সম্ভাব্যতা না হারিয়ে কোনও চিত্রের আকার পরিবর্তন করার উপায় নেই।
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;
}
আমি বিশ্বাস করি আপনি যা করতে যাচ্ছেন তা হ'ল আপনার চিত্রগুলি "আকার পরিবর্তন / পুনর্নির্মাণ"। এখানে একটি ভাল সাইট যা নির্দেশনা দেয় এবং একটি ইউটিলিটি ক্লাস সরবরাহ করে (এটি আমি ব্যবহার করতে পারি):
http://www.codeproject.com/KB/GDI-plus/imgresizoutperfgdiplus.aspx
আপনি যদি আকার পরিবর্তন না করেন, তবে রাস্টার গ্রাফিক্সের সাহায্যে আপনি এটি করতে পারবেন না।
ভাল ফিল্টারিং এবং স্মুথিংয়ের সাহায্যে আপনি যা করতে পারেন তা হ'ল কোনও উল্লেখযোগ্য গুণ না হারিয়ে পুনরায় আকার দেওয়া ।
আপনি চিত্রটির ডিপিআই মেটাডেটাও পরিবর্তন করতে পারেন (এটির কিছু রয়েছে বলে ধরে নেওয়া) যা ঠিক একই পিক্সেল গণনা রাখে, তবে চিত্রের সম্পাদকরা কীভাবে এটি 'রিয়েল-ওয়ার্ল্ড' পরিমাপে ভাববে তা পরিবর্তন করবে।
এবং কেবল সমস্ত ঘাঁটিগুলি কভার করার জন্য, যদি আপনি সত্যিই চিত্রটির ফাইলের আকার এবং প্রকৃত চিত্রের মাত্রা না বোঝাতে চান তবে আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি চিত্রের ডেটার একটি ক্ষতিহীন এনকোডিংয়ের দিকে নজর দিন। এটির জন্য আমার পরামর্শটি হ'ল চিত্রটিকে একটি .png ফাইল হিসাবে পুনর্জীবিত করা (আমি উইন্ডোগুলির চিত্রগুলির জন্য ফ্রি ট্রান্সকোডার হিসাবে পেইন্ট ব্যবহার করতে চাই। চিত্রটিতে লোড করুন, নতুন ফর্ম্যাটের মতো সংরক্ষণ করুন)
আপনি কিছু গুণ হারানো ব্যতীত কোনও চিত্রের আকার পরিবর্তন করতে পারবেন না, কেবল কারণ আপনি পিক্সেলের সংখ্যা হ্রাস করছেন।
আকারের ক্লায়েন্টের দিকটি হ্রাস করবেন না, কারণ ব্রাউজারগুলি চিত্রগুলির আকার পরিবর্তন করতে খুব ভাল কাজ করে না।
আপনি যা করতে পারেন তা হ'ল এটি রেন্ডার করার আগে বা ব্যবহারকারী হিসাবে এটি আপলোড করার আগে ক্রমবর্ধমান আকার পরিবর্তন করতে পারে।
এখানে একটি নিবন্ধ এখানে সি # তে এটি করার একটি উপায় ব্যাখ্যা করে: http://www.codeproject.com/KB/GDI-plus/imageresize.aspx
আপনি যদি এই ওপেন সোর্স এএসপি.এনইটি মডিউলটির চিত্রের আকার পরিবর্তন করতে চান কিনা তা দেখুন । এখানে একটি লাইভ ডেমো রয়েছে, তাই আপনি নিজেই এটির সাথে গোলমাল করতে পারেন। এটি এমন ফলাফল দেয় যা ফটোশপ আউটপুট থেকে পৃথক হওয়া অসম্ভব (আমার কাছে)। এটিতে অনুরূপ ফাইলের আকারও রয়েছে - এমএস তাদের জেপিইজি এনকোডারটিতে খুব ভাল কাজ করেছে।
এখানে কিছু আছে, প্রসঙ্গে সচেতন সচেতনতা পুনরায় আকারদান, আপনি এটি ব্যবহার করতে সক্ষম হবেন কিনা তা জানেন না তবে এটি দেখার পক্ষে এটি অবশ্যই নিশ্চিত
একটি দুর্দান্ত ভিডিও ডেমো (এর মধ্যবর্তী দিকে প্রসারিত হওয়া) http://www.youtube.com/watch?v=vIFCV2spKtg
এখানে কিছু কোড থাকতে পারে। http://www.semanticmetadata.net/2007/08/30/content-aware-image-resizing-gpl-implementation/
ওভারকিল কি ছিল? পিক্সেলকে কিছুটা ঝাপসা করার জন্য কিছু বর্ধিত চিত্রের জন্য আপনি প্রয়োগ করতে পারেন এমন কিছু সহজ ফিল্টার রয়েছে, আপনি এটি সন্ধান করতে পারেন।
আপনি কি আকার বড়, না আরও ছোট? একটি ছোট% দ্বারা বা 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
এখানে আপনি এই শ্রেণিতে জলছবি কোড যুক্ত করতে পারেন:
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>();
}
}
এখানে একটি ফোরাম থ্রেড যা একটি সি # চিত্রের আকার পরিবর্তনকারী কোড নমুনা সরবরাহ করে। আপনি সি # তে পুনরায় মডেলিং করতে জিডি গ্রন্থাগার বাইন্ডারগুলির একটি ব্যবহার করতে পারেন ।