썸네일 이미지 만들기


96

파일 위치에서 그리드 뷰에 썸네일 이미지를 표시하고 싶습니다. .jpeg파일 을 생성하는 방법은 무엇입니까? 에서 C#언어를 사용하고 있습니다 asp.net.


6
ImageResizer 는 필요한 작업을 정확히 수행하도록 설계된 서버 안전 라이브러리입니다. GetThumbnailImage와 달리 고품질 결과를 생성하고 코드 샘플과 달리 체처럼 메모리가 누출되지 않습니다. 지금은 신경 쓰지 않을 수도 있지만 코어 덤프에 무릎을 꿇 으면 몇 달 안에 그렇게 될 것입니다.
Lilith River



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를 가져 오는 데 사용했으며 결과 "썸네일"의 크기는 200kB (원래 350kB)였습니다. 이 방법은 피해야 할 것입니다.
Vojtěch Dohnal

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

나는 이렇게 주었다 ... var path = @ "C : \ Users \ Gopal \ Desktop \ files.jpeg"; 비트 맵 srcBmp = new Bitmap (path);
Gopal Palraj

HttpResponseMessage를 사용하는 사용자 :response.Content = new ByteArrayContent(memoryStream.ToArray());
Hp93

주의,이 코드는 이미지를 가정하는 것은 (가로) "수평"입니다
알렉스

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.