আমি ফাইলের অবস্থান থেকে গ্রিডভিউতে থাম্বনেইল চিত্রটি প্রদর্শন করতে চাই। .jpeg
ফাইলটি কীভাবে তৈরি করা যায় ? আমি C#
সাথে ভাষা ব্যবহার করছি asp.net
।
আমি ফাইলের অবস্থান থেকে গ্রিডভিউতে থাম্বনেইল চিত্রটি প্রদর্শন করতে চাই। .jpeg
ফাইলটি কীভাবে তৈরি করা যায় ? আমি C#
সাথে ভাষা ব্যবহার করছি asp.net
।
উত্তর:
আপনি ক্লাসে GetThumbnailImage
পদ্ধতি ব্যবহার করতে হবে Image
:
https://msdn.microsoft.com/en-us/library/8t23aykb%28v=vs.110%29.aspx
এখানে একটি মোটামুটি উদাহরণ যা একটি চিত্র ফাইল নেয় এবং এটি থেকে একটি থাম্বনেইল চিত্র তৈরি করে, তারপরে এটিকে আবার ডিস্কে সংরক্ষণ করে।
Image image = Image.FromFile(fileName);
Image thumb = image.GetThumbnailImage(120, 120, ()=>false, IntPtr.Zero);
thumb.Save(Path.ChangeExtension(fileName, "thumb"));
এটি System.Drawing নেমস্পেসে (System.Drawing.dll এ)।
আচরণ:
যদি চিত্রটিতে একটি এমবেড থাকা থাম্বনেইল চিত্র থাকে তবে এই পদ্ধতিটি এম্বেড থাকা থাম্বনেলটি পুনরুদ্ধার করে এবং অনুরোধ করা আকারে এটি স্কেল করে। যদি চিত্রটিতে একটি এম্বেড থাকা থাম্বনেইল চিত্র না থাকে তবে এই পদ্ধতিটি মূল চিত্রটি স্কেল করে একটি থাম্বনেইল চিত্র তৈরি করে।
গুরুত্বপূর্ণ: উপরের মাইক্রোসফ্ট লিঙ্কের মন্তব্য বিভাগটি কিছু সম্ভাব্য সমস্যার বিষয়ে সতর্ক করে:
GetThumbnailImage
অনুরোধ করা হলে থাম্বনেল চিত্র 120 সম্পর্কে এক্স 120 পিক্সেল আকার পদ্ধতি ভাল কাজ করে। যদি আপনি একটি এম্বেড থাকা থাম্বনেইলযুক্ত চিত্র থেকে একটি বৃহত থাম্বনেল চিত্র (উদাহরণস্বরূপ, 300 x 300) অনুরোধ করেন তবে থাম্বনেইল চিত্রটিতে গুণমানের লক্ষণীয় ক্ষতি হতে পারে ।
DrawImage
পদ্ধতিটি কল করে মূল চিত্রটি (এম্বেড থাকা থাম্বনেইলকে স্কেল করার পরিবর্তে) স্কেল করা ভাল ।
নিম্নলিখিত কোডটি প্রতিক্রিয়ার সাথে আনুপাতিকভাবে একটি চিত্র লিখবে, আপনি নিজের উদ্দেশ্যে কোডটি পরিবর্তন করতে পারেন:
public void WriteImage(string path, int width, int height)
{
Bitmap srcBmp = new Bitmap(path);
float ratio = srcBmp.Width / srcBmp.Height;
SizeF newSize = new SizeF(width, height * ratio);
Bitmap target = new Bitmap((int) newSize.Width,(int) newSize.Height);
HttpContext.Response.Clear();
HttpContext.Response.ContentType = "image/jpeg";
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(memoryStream, ImageFormat.Jpeg);
memoryStream.WriteTo(HttpContext.Response.OutputStream);
}
}
Response.End();
}
response.Content = new ByteArrayContent(memoryStream.ToArray());
এখানে একটি ছোট চিত্র কীভাবে তৈরি করা যায় তার সম্পূর্ণ উদাহরণ (থাম্বনেইল)। এই স্নিপেট চিত্রটির আকার পরিবর্তন করে, যখন প্রয়োজন হয় তখন ঘুরিয়ে দেয় (যদি কোনও ফোন উলম্বভাবে ধারণ করা থাকে) এবং আপনি বর্গক্ষেত্রের থাম্বগুলি তৈরি করতে চান তবে চিত্রটি প্যাড করে। এই স্নিপেটটি একটি জেপিইজি তৈরি করে, তবে অন্যান্য ফাইলের জন্য এটি সহজেই সংশোধন করা যায়। এমনকি চিত্রটি সর্বাধিক অনুমোদিত আকারের চেয়ে ছোট হলেও চিত্রটি সংকুচিত হবে এবং এটি একই ডিপিআই এবং সংক্ষেপণের স্তরের চিত্রগুলি তৈরি করতে রেজোলিউশনের পরিবর্তন হয়েছে।
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.IO;
//set the resolution, 72 is usually good enough for displaying images on monitors
float imageResolution = 72;
//set the compression level. higher compression = better quality = bigger images
long compressionLevel = 80L;
public Image resizeImage(Image image, int maxWidth, int maxHeight, bool padImage)
{
int newWidth;
int newHeight;
//first we check if the image needs rotating (eg phone held vertical when taking a picture for example)
foreach (var prop in image.PropertyItems)
{
if (prop.Id == 0x0112)
{
int orientationValue = image.GetPropertyItem(prop.Id).Value[0];
RotateFlipType rotateFlipType = getRotateFlipType(orientationValue);
image.RotateFlip(rotateFlipType);
break;
}
}
//apply the padding to make a square image
if (padImage == true)
{
image = applyPaddingToImage(image, Color.Red);
}
//check if the with or height of the image exceeds the maximum specified, if so calculate the new dimensions
if (image.Width > maxWidth || image.Height > maxHeight)
{
double ratioX = (double)maxWidth / image.Width;
double ratioY = (double)maxHeight / image.Height;
double ratio = Math.Min(ratioX, ratioY);
newWidth = (int)(image.Width * ratio);
newHeight = (int)(image.Height * ratio);
}
else
{
newWidth = image.Width;
newHeight = image.Height;
}
//start the resize with a new image
Bitmap newImage = new Bitmap(newWidth, newHeight);
//set the new resolution
newImage.SetResolution(imageResolution, imageResolution);
//start the resizing
using (var graphics = Graphics.FromImage(newImage))
{
//set some encoding specs
graphics.CompositingMode = CompositingMode.SourceCopy;
graphics.CompositingQuality = CompositingQuality.HighQuality;
graphics.SmoothingMode = SmoothingMode.HighQuality;
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
graphics.DrawImage(image, 0, 0, newWidth, newHeight);
}
//save the image to a memorystream to apply the compression level
using (MemoryStream ms = new MemoryStream())
{
EncoderParameters encoderParameters = new EncoderParameters(1);
encoderParameters.Param[0] = new EncoderParameter(Encoder.Quality, compressionLevel);
newImage.Save(ms, getEncoderInfo("image/jpeg"), encoderParameters);
//save the image as byte array here if you want the return type to be a Byte Array instead of Image
//byte[] imageAsByteArray = ms.ToArray();
}
//return the image
return newImage;
}
//=== image padding
public Image applyPaddingToImage(Image image, Color backColor)
{
//get the maximum size of the image dimensions
int maxSize = Math.Max(image.Height, image.Width);
Size squareSize = new Size(maxSize, maxSize);
//create a new square image
Bitmap squareImage = new Bitmap(squareSize.Width, squareSize.Height);
using (Graphics graphics = Graphics.FromImage(squareImage))
{
//fill the new square with a color
graphics.FillRectangle(new SolidBrush(backColor), 0, 0, squareSize.Width, squareSize.Height);
//put the original image on top of the new square
graphics.DrawImage(image, (squareSize.Width / 2) - (image.Width / 2), (squareSize.Height / 2) - (image.Height / 2), image.Width, image.Height);
}
//return the image
return squareImage;
}
//=== get encoder info
private ImageCodecInfo getEncoderInfo(string mimeType)
{
ImageCodecInfo[] encoders = ImageCodecInfo.GetImageEncoders();
for (int j = 0; j < encoders.Length; ++j)
{
if (encoders[j].MimeType.ToLower() == mimeType.ToLower())
{
return encoders[j];
}
}
return null;
}
//=== determine image rotation
private RotateFlipType getRotateFlipType(int rotateValue)
{
RotateFlipType flipType = RotateFlipType.RotateNoneFlipNone;
switch (rotateValue)
{
case 1:
flipType = RotateFlipType.RotateNoneFlipNone;
break;
case 2:
flipType = RotateFlipType.RotateNoneFlipX;
break;
case 3:
flipType = RotateFlipType.Rotate180FlipNone;
break;
case 4:
flipType = RotateFlipType.Rotate180FlipX;
break;
case 5:
flipType = RotateFlipType.Rotate90FlipX;
break;
case 6:
flipType = RotateFlipType.Rotate90FlipNone;
break;
case 7:
flipType = RotateFlipType.Rotate270FlipX;
break;
case 8:
flipType = RotateFlipType.Rotate270FlipNone;
break;
default:
flipType = RotateFlipType.RotateNoneFlipNone;
break;
}
return flipType;
}
//== convert image to base64
public string convertImageToBase64(Image image)
{
using (MemoryStream ms = new MemoryStream())
{
//convert the image to byte array
image.Save(ms, ImageFormat.Jpeg);
byte[] bin = ms.ToArray();
//convert byte array to base64 string
return Convert.ToBase64String(bin);
}
}
Asp.net ব্যবহারকারীদের জন্য কীভাবে কোনও ফাইল আপলোড করবেন, এর আকার পরিবর্তন করুন এবং ফলাফলটি পৃষ্ঠায় প্রদর্শন করবেন তার সামান্য উদাহরণ।
//== the button click method
protected void Button1_Click(object sender, EventArgs e)
{
//check if there is an actual file being uploaded
if (FileUpload1.HasFile == false)
{
return;
}
using (Bitmap bitmap = new Bitmap(FileUpload1.PostedFile.InputStream))
{
try
{
//start the resize
Image image = resizeImage(bitmap, 256, 256, true);
//to visualize the result, display as base64 image
Label1.Text = "<img src=\"data:image/jpg;base64," + convertImageToBase64(image) + "\">";
//save your image to file sytem, database etc here
}
catch (Exception ex)
{
Label1.Text = "Oops! There was an error when resizing the Image.<br>Error: " + ex.Message;
}
}
}
হাই রেস চিত্রটি থাম্বনেল আকারে রূপান্তর করার জন্য এখানে একটি উদাহরণ দেওয়া আছে-
protected void Button1_Click(object sender, EventArgs e)
{
//---------- Getting the Image File
System.Drawing.Image img = System.Drawing.Image.FromFile(Server.MapPath("~/profile/Avatar.jpg"));
//---------- Getting Size of Original Image
double imgHeight = img.Size.Height;
double imgWidth = img.Size.Width;
//---------- Getting Decreased Size
double x = imgWidth / 200;
int newWidth = Convert.ToInt32(imgWidth / x);
int newHeight = Convert.ToInt32(imgHeight / x);
//---------- Creating Small Image
System.Drawing.Image.GetThumbnailImageAbort myCallback = new System.Drawing.Image.GetThumbnailImageAbort(ThumbnailCallback);
System.Drawing.Image myThumbnail = img.GetThumbnailImage(newWidth, newHeight, myCallback, IntPtr.Zero);
//---------- Saving Image
myThumbnail.Save(Server.MapPath("~/profile/NewImage.jpg"));
}
public bool ThumbnailCallback()
{
return false;
}
সূত্র- http://iknowledgeboy.blogspot.in/2014/03/c-creating-thumbnail-of-large-image-by.html