Buat gambar thumbnail

96

Saya ingin menampilkan gambar thumbnail dalam tampilan grid dari lokasi file. Bagaimana cara menghasilkan .jpegfile itu? Saya menggunakan C#bahasa dengan asp.net.

Angsa Merah
sumber
6
ImageResizer adalah pustaka aman server yang dirancang untuk melakukan apa yang Anda butuhkan. Tidak seperti GetThumbnailImage, ini menghasilkan hasil berkualitas tinggi, dan tidak seperti contoh kode, ini tidak membocorkan memori seperti saringan. Anda mungkin tidak peduli sekarang, tetapi Anda akan melakukannya dalam beberapa bulan ketika Anda berlutut di dalam timbunan inti.
Lilith River
Lihat ini: docs.microsoft.com/en-us/dotnet/api/…
Md. Sabbir Ahamed
ImageResizer memang bagus, tetapi tidak gratis
Boban Stojanovski

Jawaban:

222

Anda harus menggunakan GetThumbnailImagemetode di Imagekelas:

https://msdn.microsoft.com/en-us/library/8t23aykb%28v=vs.110%29.aspx

Berikut adalah contoh kasar yang mengambil file gambar dan membuat gambar thumbnail darinya, lalu menyimpannya kembali ke disk.

Image image = Image.FromFile(fileName);
Image thumb = image.GetThumbnailImage(120, 120, ()=>false, IntPtr.Zero);
thumb.Save(Path.ChangeExtension(fileName, "thumb"));

Itu ada di namespace System.Drawing (di System.Drawing.dll).

Tingkah laku:

Jika Gambar berisi gambar mini yang disematkan, metode ini mengambil gambar mini yang disematkan dan menskalakannya ke ukuran yang diminta. Jika Gambar tidak berisi gambar kecil yang disematkan, metode ini membuat gambar kecil dengan menskalakan gambar utama.


Penting: bagian komentar di tautan Microsoft di atas memperingatkan masalah potensial tertentu:

The GetThumbnailImageMetode bekerja dengan baik ketika diminta gambar kecil memiliki ukuran sekitar 120 x 120 piksel. Jika Anda meminta gambar mini besar (misalnya, 300 x 300) dari Gambar yang memiliki gambar kecil tersemat, mungkin ada penurunan kualitas yang nyata pada gambar mini tersebut .

Mungkin lebih baik untuk menskalakan gambar utama (daripada menskalakan thumbnail yang disematkan) dengan memanggil DrawImagemetode tersebut.

Russell Troywest
sumber
5
Ini hanya dapat digunakan pada gambar JPG secara umum. Jika Anda mencoba mengubah ukuran gambar PNG seperti ini, Anda akan mendapatkan kesalahan ini.
HBlackorby
Sungguh, gunakan ini untuk mendapatkan thumbnail 400x225 dari foto full hd dan ukuran "thumbnail" yang dihasilkan adalah 200 kB (Asli 350 kB). Cara ini harus dihindari.
Vojtěch Dohnal
1
@NathanaelJones, apakah kamu serius? ImageResizer tidak gratis untuk bisnis.
Ciaran Gallagher
26

Kode berikut akan menulis gambar secara proporsional dengan respons, Anda dapat mengubah kode untuk tujuan Anda:

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();
}
Priyan R
sumber
Saya memberikan jalur file lokal saya di jalur string. itu mengembalikan "format jalur yang diberikan tidak didukung".
Gopal Palraj
saya memberikan seperti ini ... var path = @ "C: \ Users \ Gopal \ Desktop \ files.jpeg"; Bitmap srcBmp = Bitmap baru (jalur);
Gopal Palraj
Bagi mereka yang menggunakan HttpResponseMessage:response.Content = new ByteArrayContent(memoryStream.ToArray());
Hp93
hati-hati, kode ini mengasumsikan gambar "horizontal" (lanskap)
Alex
8

Berikut adalah contoh lengkap cara membuat gambar yang lebih kecil (thumbnail). Cuplikan ini mengubah ukuran Gambar, memutarnya saat diperlukan (jika ponsel dipegang secara vertikal) dan mengisi gambar jika Anda ingin membuat ibu jari persegi. Cuplikan ini membuat JPEG, tetapi dapat dengan mudah dimodifikasi untuk jenis file lainnya. Meskipun gambar akan lebih kecil dari ukuran maksimal yang diperbolehkan, gambar akan tetap dikompresi dan resolusinya diubah untuk membuat gambar dengan dpi dan tingkat kompresi yang sama.

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);
    }
}

Untuk pengguna asp.net sedikit contoh bagaimana mengupload file, mengubah ukurannya dan menampilkan hasilnya di halaman.

//== 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;
        }
    }
}
VDWWD
sumber
Saya menyukai contoh kode ini dan memilih untuk menggunakannya. Namun, apa pun perubahan yang saya lakukan pada berbagai opsi (imageResolution, compressionLevel, CompositingMode, CompositingQuality, SmoothingMode, InterpolationMode, PixelOffsetMode), ukuran file gambar hanya berkurang sedikit. Dan saya tidak pernah melihat perbedaan pada gambar yang dibuat. Akhirnya, saya memilih untuk menyimpan gambar ke file alih-alih aliran memori dan dapat melihat perubahan drastis. Bagi siapa pun yang menggunakan ini tampaknya menyimpan ke aliran memori tidak mempengaruhi gambar yang dikembalikan.
BLaminack
1

Berikut adalah contoh untuk mengubah gambar resolusi tinggi menjadi ukuran thumbnail-

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;
}

Sumber- http://iknowledgeboy.blogspot.in/2014/03/c-creating-thumbnail-of-large-image-by.html

kamalpreet
sumber