Küçük resim oluştur


96

Dosya konumundan bir ızgara görünümünde küçük resim görüntülemek istiyorum. .jpegDosyadan nasıl oluşturulur ? İle C#dil kullanıyorum asp.net.


6
ImageResizer , tam olarak ihtiyacınız olanı yapmak için tasarlanmış sunucu güvenli bir kitaplıktır. GetThumbnailImage'ın aksine, yüksek kaliteli sonuçlar üretir ve kod örneklerinden farklı olarak, bir elek gibi bellek sızıntısı yapmaz. Şimdi umursamayabilirsin, ama birkaç ay içinde diz çöküntülerinde diz çöktüğün zaman alacaksın.
Lilith River



ImageResizer harika, ancak ücretsiz değil
Boban Stojanovski

Yanıtlar:


222

Sınıfta GetThumbnailImagemetodu kullanmalısınız Image:

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

İşte bir görüntü dosyasını alıp ondan küçük resim oluşturan ve ardından diske geri kaydeden kaba bir örnek.

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

System.Drawing ad alanında (System.Drawing.dll'de) bulunur.

Davranış:

Görüntü gömülü bir küçük resim içeriyorsa, bu yöntem gömülü küçük resmi alır ve istenen boyuta ölçeklendirir. Görüntü gömülü bir küçük resim içermiyorsa, bu yöntem ana görüntüyü ölçeklendirerek bir küçük resim oluşturur.


Önemli: Yukarıdaki Microsoft bağlantısının açıklamalar bölümü bazı olası sorunlara karşı uyarır:

GetThumbnailImageKüçük resim 120 x 120 hakkında piksel boyutuna sahip istendiğinde yöntem iyi çalışıyor. Gömülü küçük resmi olan bir Görüntüden büyük bir küçük resim (örneğin, 300 x 300) talep ederseniz, küçük resim görüntüsünde gözle görülür bir kalite kaybı olabilir .

DrawImageYöntemi çağırarak ana görüntüyü ölçeklemek (gömülü küçük resmi ölçeklemek yerine) daha iyi olabilir .


5
Genelde yalnızca JPG görüntülerinde kullanılabilir. Bunun gibi bir PNG resmini yeniden boyutlandırmaya çalışırsanız bu hatayı alırsınız.
HBlackorby

Gerçekten, bunu tam HD bir fotoğrafın 400x225 boyutundaki küçük resmini almak için kullandık ve elde edilen "küçük resmin" boyutu 200 kB idi (Orijinal 350 kB). Bu yöntem kaçınılması gereken bir şeydir.
Vojtěch Dohnal

1
@NathanaelJones, ciddi misin? ImageResizer işletmeler için ücretsiz değildir.
Ciaran Gallagher

26

Aşağıdaki kod, yanıtla orantılı olarak bir resim yazacaktır, kodu amacınıza göre değiştirebilirsiniz:

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

Yerel dosya yolumu dize yolunda verdim. "verilen yol biçimi desteklenmiyor" döndürür.
Gopal Palraj

ben böyle verdim ... var path = @ "C: \ Users \ Gopal \ Desktop \ files.jpeg"; Bitmap srcBmp = new Bitmap (yol);
Gopal Palraj 01

HttpResponseMessage kullananlar için:response.Content = new ByteArrayContent(memoryStream.ToArray());
Hp93

dikkatli, bu kod resimlerin "yatay" (yatay) olduğunu varsayıyor
Alex

9

Daha küçük bir görüntünün (küçük resim) nasıl oluşturulacağına dair eksiksiz bir örnek. Bu pasaj, Görüntüyü yeniden boyutlandırır, gerektiğinde döndürür (telefon dikey olarak tutulmuşsa) ve kare parmaklar oluşturmak istiyorsanız görüntüyü doldurur. Bu parçacık bir JPEG oluşturur, ancak diğer dosya türleri için kolayca değiştirilebilir. Görüntü izin verilen maksimum boyuttan daha küçük olsa bile, görüntü yine de sıkıştırılır ve çözünürlüğü aynı dpi ve sıkıştırma seviyesinde görüntüler oluşturmak için değiştirilir.

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 kullanıcıları için bir dosyanın nasıl yükleneceği, yeniden boyutlandırılacağı ve sonucu sayfada nasıl görüntüleneceği ile ilgili küçük bir örnek.

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

Bu kod örneğini beğendim ve kullanmayı seçtim. Ancak, çeşitli seçeneklerde (imageResolution, CompositingLevel, CompositingMode, CompositingQuality, SmoothingMode, InterpolationMode, PixelOffsetMode) ne tür değişiklikler yaptığım önemli değil, görüntü dosyasının boyutu yalnızca küçük bir miktar azalttı. Ve yaratılan görüntüde hiçbir fark görmedim. Son olarak, görüntüyü bellek akışı yerine bir dosyaya kaydetmeyi seçtim ve büyük değişiklikleri görebildim. Bunu kullanan herkes için bir bellek akışına kaydetmenin döndürülen görüntüyü etkilemediği görülmektedir.
BLaminack

1

İşte yüksek çözünürlüklü görüntüyü küçük resim boyutuna dönüştürmek için bir örnek.

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

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.