サムネイル画像を作成


96

ファイルの場所からグリッドビューにサムネイル画像を表示したい。.jpegファイルの生成方法は?でC#言語を使用していasp.netます。


6
ImageResizerは、必要なものを正確に実行するように設計されたサーバーセーフライブラリです。GetThumbnailImageとは異なり、高品質の結果を生成し、コードサンプルとは異なり、ふるいのようにメモリをリークしません。今は気にしないかもしれませんが、コアダンプにひざまずいているときは、数か月のうちにそうなるでしょう。
リリス川



ImageResizerは素晴らしいですが、無料ではありません
Boban Stojanovski

回答:


222

クラスで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内)にあります。

動作:

Imageに埋め込まれたサムネイル画像が含まれている場合、このメソッドは埋め込まれたサムネイルを取得し、要求されたサイズに拡大縮小します。画像に埋め込まれたサムネイル画像が含まれていない場合、このメソッドはメイン画像を拡大縮小してサムネイル画像を作成します。


重要:上記のMicrosoftリンクの備考セクションは、特定の潜在的な問題を警告しています。

このGetThumbnailImageメソッドは、リクエストされたサムネイル画像のサイズが約120 x 120ピクセルの場合にうまく機能します。サムネイル埋め込まれている画像から大きなサムネイル画像(300 x 300など)をリクエストすると、サムネイル画像の品質が著しく低下する可能性があります

DrawImageメソッドを呼び出すことにより、(埋め込まれたサムネイルをスケーリングするのではなく)メイン画像をスケーリングする方がよい場合があります。


5
通常、JPG画像でのみ使用できます。このようにPNG画像のサイズを変更しようとすると、このエラーが発生します。
HBlackorby

実際、これを使用してフルHD写真のサムネイル400x225を取得し、結果の「サムネイル」のサイズは200 kB(元の350 kB)でした。この方法は避けるべきものです。
VojtěchDohnal

1
@NathanaelJones、本気ですか?ImageResizerは企業にとって無料ではありません。
Ciaran Gallagher

26

次のコードは、応答に比例して画像を書き込みます。目的に応じてコードを変更できます。

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

文字列パスでローカルファイルパスを指定しました。「指定されたパス形式はサポートされていません」を返します。
Gopal Palraj 2018年

私はこのように与えました... var path = @ "C:\ Users \ Gopal \ Desktop \ files.jpeg"; ビットマップsrcBmp = new Bitmap(path);
Gopal Palraj 2018年

HttpResponseMessageを使用する場合:response.Content = new ByteArrayContent(memoryStream.ToArray());
Hp93

注意してください、このコードは画像が「水平」(横)であると想定しています
Alex

8

以下は、小さい画像(サムネイル)を作成する方法の完全な例です。このスニペットは画像のサイズを変更し、必要に応じて画像を回転させ(スマートフォンが縦に構えられている場合)、正方形の親指を作成する場合は画像にパディングします。このスニペットは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);
    }
}

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

このコード例が気に入って、使用することにしました。ただし、さまざまなオプション(imageResolution、compressionLevel、CompositingMode、CompositingQuality、SmoothingMode、InterpolationMode、PixelOffsetMode)に加えた変更に関係なく、イメージファイルのサイズはわずかしか減少しませんでした。そして、私は作成されたイメージに違いを見たことはありません。最後に、画像をメモリストリームではなくファイルに保存することを選択し、大幅な変更を確認することができました。これを使用している人にとっては、メモリストリームに保存しても返される画像には影響がないようです。
BLaminack

1

高解像度画像をサムネイルサイズに変換する例を以下に示します。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.