C# 创建缩略图图像
我想从文件位置在gridview中显示缩略图。如何生成C# 创建缩略图图像,c#,asp.net,gridview,thumbnails,C#,Asp.net,Gridview,Thumbnails,我想从文件位置在gridview中显示缩略图。如何生成.jpeg文件的? 我正在使用C#语言与asp.net您必须在Image类中使用GetThumbnailImage方法: 下面是一个粗略的示例,它获取一个图像文件并从中生成一个缩略图,然后将其保存回磁盘 Image image = Image.FromFile(fileName); Image thumb = image.GetThumbnailImage(120, 120, ()=>false, IntPtr.Zero); thum
.jpeg
文件的?
我正在使用
C#
语言与asp.net
您必须在Image
类中使用GetThumbnailImage
方法:
下面是一个粗略的示例,它获取一个图像文件并从中生成一个缩略图,然后将其保存回磁盘
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中)
行为:
如果图像包含嵌入的缩略图图像,则此方法
检索嵌入的缩略图并将其缩放到请求的大小。
如果图像不包含嵌入的缩略图图像,则此方法
通过缩放主图像来创建缩略图
重要提示:上面Microsoft链接的备注部分警告某些潜在问题:
GetThumbnailImage
方法在请求的缩略图
图像的大小约为120 x 120像素。如果你要求一个大的
来自具有
嵌入缩略图后,图像质量可能会明显下降
缩略图
最好是缩放主图像(而不是
通过调用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();
}
下面是如何创建较小图像(缩略图)的完整示例。此代码段调整图像大小,在需要时旋转图像(如果手机是垂直放置的),如果要创建方形拇指,则填充图像。此代码段创建了一个JPEG,但可以很容易地针对其他文件类型对其进行修改。即使图像小于允许的最大大小,图像仍将被压缩,其分辨率也会改变,以创建具有相同dpi和压缩级别的图像
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);
}
}
使用系统;
使用系统图;
使用System.Drawing.Drawing2D;
使用系统、绘图、成像;
使用System.IO;
//设置分辨率,72通常足以在监视器上显示图像
浮点图像分辨率=72;
//设置压缩级别。更高的压缩=更好的质量=更大的图像
长压缩水平=80L;
公共图像大小图像(图像图像、int-maxWidth、int-maxHeight、bool-padImage)
{
int newWidth;
int newHeight;
//首先,我们检查图像是否需要旋转(例如拍照时手机保持垂直)
foreach(image.PropertyItems中的变量prop)
{
如果(项目Id==0x0112)
{
int-orientationValue=image.GetPropertyItem(prop.Id).Value[0];
RotateFlipType RotateFlipType=getRotateFlipType(方向值);
image.RotateFlip(rotateFlipType);
打破
}
}
//应用填充以生成方形图像
if(padImage==true)
{
image=applyPaddingToImage(图像,颜色为红色);
}
//检查图像的宽度或高度是否超过指定的最大值,如果超过,请计算新尺寸
if(image.Width>maxWidth | | image.Height>maxHeight)
{
double ratioX=(double)maxWidth/image.Width;
双比值=(双)最大高度/图像高度;
双比值=数学最小值(比值,比值);
newWidth=(int)(image.Width*比率);
newHeight=(int)(image.Height*比率);
}
其他的
{
newWidth=image.Width;
newHeight=image.Height;
}
//使用新图像开始调整大小
位图newImage=新位图(newWidth、newHeight);
//制定新的决议
newImage.SetResolution(图像分辨率,图像分辨率);
//开始调整大小
使用(var graphics=graphics.FromImage(newImage))
{
//设置一些编码规格
graphics.CompositingMode=CompositingMode.SourceCopy;
graphics.CompositingQuality=CompositingQuality.HighQuality;
graphics.SmoothingMode=SmoothingMode.HighQuality;
graphics.InterpolationMode=InterpolationMode.HighQualityBicubic;
graphics.PixelOffsetMode=PixelOffsetMode.HighQuality;
graphics.DrawImage(图像,0,0,newWidth,newHeight);
}
//将图像保存到memorystream以应用压缩级别
使用(MemoryStream ms=new MemoryStream())
{
EncoderParameters EncoderParameters=新的EncoderParameters(1);
encoderParameters.Param[0]=新的EncoderParameter(Encoder.Quality,compressionLevel);
保存(ms、getEncoderInfo(“图像/jpeg”)、编码器参数);
//如果希望返回类型为字节数组而不是图像,请在此处将图像另存为字节数组
//字节[]imageAsByteArray=ms.ToArray();
}
//返回图像
返回新图像;
}
//==图像填充
公共图像应用程序添加到图像(图像图像,彩色背景色)
{
//获取图像维度的最大大小
int maxSize=Math.Max(image.Height,image.Width);
Size squareSize=新尺寸(maxSize,maxSize);
//创建一个新的正方形图像
位图squareImage=新位图(squareSize.Width、squareSize.Height);
使用(Graphics=Graphics.FromImage(squareImage))
{
//用颜色填充新的正方形
图形.FillRectangle(新的SolidBrush(背景色),0,0,squareSize.Width,squareSize.Height);
//将原始图像放在新正方形的顶部
graphics.DrawImage(image,(squareSize.Width/2)-(image.Width/2),(squareSize.Height/2)-(image.Height/2),image.Width,image.Height);
}
//返回图像
返回图像;
}
//==获取编码器信息
私有ImageCodeInfo getEncoderInfo(字符串mimeType)
{
ImageCodecInfo[]编码器=ImageCodecInfo.GetImageEncoders();
对于(int j=0;j//== 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;
}
using System;
using System.Drawing;
class Program
{
static void Main()
{
const string input = "C:\\background1.png";
const string output = "C:\\thumbnail.png";
// Load image.
Image image = Image.FromFile(input);
// Compute thumbnail size.
Size thumbnailSize = GetThumbnailSize(image);
// Get thumbnail.
Image thumbnail = image.GetThumbnailImage(thumbnailSize.Width,
thumbnailSize.Height, null, IntPtr.Zero);
// Save thumbnail.
thumbnail.Save(output);
}
static Size GetThumbnailSize(Image original)
{
// Maximum size of any dimension.
const int maxPixels = 40;
// Width and height.
int originalWidth = original.Width;
int originalHeight = original.Height;
// Return original size if image is smaller than maxPixels
if (originalWidth <= maxPixels || originalHeight <= maxPixels)
{
return new Size(originalWidth, originalHeight);
}
// Compute best factor to scale entire image based on larger dimension.
double factor;
if (originalWidth > originalHeight)
{
factor = (double)maxPixels / originalWidth;
}
else
{
factor = (double)maxPixels / originalHeight;
}
// Return thumbnail size.
return new Size((int)(originalWidth * factor), (int)(originalHeight * factor));
}
}
private static FileInfo CreateThumbnailImage(string imageFileName, string thumbnailFileName)
{
const int thumbnailSize = 150;
using (var image = Image.FromFile(imageFileName))
{
var imageHeight = image.Height;
var imageWidth = image.Width;
if (imageHeight > imageWidth)
{
imageWidth = (int) (((float) imageWidth / (float) imageHeight) * thumbnailSize);
imageHeight = thumbnailSize;
}
else
{
imageHeight = (int) (((float) imageHeight / (float) imageWidth) * thumbnailSize);
imageWidth = thumbnailSize;
}
using (var thumb = image.GetThumbnailImage(imageWidth, imageHeight, () => false, IntPtr.Zero))
//Save off the new thumbnail
thumb.Save(thumbnailFileName);
}
return new FileInfo(thumbnailFileName);
}