C# 创建缩略图图像

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

我想从文件位置在gridview中显示缩略图。如何生成
.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);
}