调整图像大小会损坏像素

时间:2014-04-18 06:20:32

标签: c# .net asp.net-mvc wpf image

如果图像大于800 X 600像素,我的要求是调整图像大小。我必须根据纵横比将其调整为800 X 600分辨率。

我使用下面的代码重新调整大小:

public string ResizeUserImage(string fullFileName, int maxHeight, int maxWidth, string newFileName)
{
        string savepath = System.Web.HttpContext.Current.Server.MapPath("//InitiativeImage//");

        try
        {
            using (Image originalImage = Image.FromFile(fullFileName))
            {
                int height = originalImage.Height;
                int width = originalImage.Width;
                int newHeight = maxHeight;
                int newWidth = maxWidth;

                if (height > maxHeight || width > maxWidth)
                {
                    if (height > maxHeight)
                    {
                        newHeight = maxHeight;
                        float temp = ((float)width / (float)height) * (float)maxHeight;
                        newWidth = Convert.ToInt32(temp);

                        height = newHeight;
                        width = newWidth;
                    }

                    if (width > maxWidth)
                    {
                        newWidth = maxWidth;
                        float temp = ((float)height / (float)width) * (float)maxWidth;
                        newHeight = Convert.ToInt32(temp);
                    }

                    Image.GetThumbnailImageAbort abort = new Image.GetThumbnailImageAbort(ThumbnailCallback);
                    using (Image resizedImage = originalImage.GetThumbnailImage(newWidth, newHeight, abort, System.IntPtr.Zero))
                    {
                        //When image is compress then store the image

                        var guid = Guid.NewGuid().ToString();
                        string latestFileName = guid + Path.GetExtension(newFileName);

                        resizedImage.Save(savepath + @"\" + latestFileName);

                        string finalPath = AppSettings.Domain + "InitiativeImage/" + latestFileName;

                        return finalPath;

                    }


                }
                else if (fullFileName != newFileName)
                {

                    //var guid = Guid.NewGuid().ToString();
                    //newFileName = guid + Path.GetExtension(newFileName);

                    //// no resizing necessary, but need to create new file 
                    //originalImage.Save(savepath + @"\" + newFileName);

                    //string finalPath = AppSettings.Domain + "UserImage/" + newFileName;

                    return newFileName;
                }


                return fullFileName;
            }

        }
        catch (Exception)
        {

            throw;
        }
    }

它完美无缺,但调整图像大小会在像素中受损。

请参阅下面我上传到服务器的原始图片:

Original image

重新调整大小后,会出现如下图像所示的损坏:

re-sized image

希望你有我的问题。调整大小的图像在像素中受损。请让我知道我错在哪里或问题出在哪里。

2 个答案:

答案 0 :(得分:2)

请尝试以下功能。

public void FixedSize(string oldImageFile, int Width, int Height,string finalpath)
    {
        Bitmap imgPhoto = new Bitmap(oldImageFile);
        int sourceWidth = imgPhoto.Width;
        int sourceHeight = imgPhoto.Height;
        int sourceX = 0;
        int sourceY = 0;
        int destX = 0;
        int destY = 0;

        float nPercent = 0;
        float nPercentW = 0;
        float nPercentH = 0;

        nPercentW = ((float)Width / (float)sourceWidth);
        nPercentH = ((float)Height / (float)sourceHeight);
        if (nPercentH < nPercentW)
        {
            nPercent = nPercentH;
            destX = System.Convert.ToInt16((Width -
                          (sourceWidth * nPercent)) / 2);
        }
        else
        {
            nPercent = nPercentW;
            destY = System.Convert.ToInt16((Height -
                          (sourceHeight * nPercent)) / 2);
        }

        int destWidth = (int)(sourceWidth * nPercent);
        int destHeight = (int)(sourceHeight * nPercent);

        Bitmap bmPhoto = new Bitmap(destWidth, destHeight,
                          PixelFormat.Format24bppRgb);
        bmPhoto.SetResolution(imgPhoto.HorizontalResolution,
                         imgPhoto.VerticalResolution);

        Graphics grPhoto = Graphics.FromImage(bmPhoto);
        grPhoto.Clear(Color.White);
        grPhoto.InterpolationMode =
                InterpolationMode.HighQualityBicubic;

        grPhoto.DrawImage(imgPhoto,
            new Rectangle(0, 0, destWidth, destHeight),
            new Rectangle(sourceX, sourceY, sourceWidth, sourceHeight),
            GraphicsUnit.Pixel);

        grPhoto.Dispose();
        bmPhoto.Save(finalpath);
    }

答案 1 :(得分:1)

来自Image.GetThumbnailImage方法的文档:

  

当请求的缩略图图像的大小约为120 x 120像素时,GetThumbnailImage方法很有效。如果从具有嵌入式缩略图的图像请求大型缩略图图像(例如,300 x 300),则缩略图图像中可能会出现明显的质量损失。通过调用DrawImage方法缩放主图像(而不是缩放嵌入的缩略图)可能会更好。

但是您的目标大小约为800x600像素,远高于缩进使用。

因此,我建议您查看有关图像大小调整的this answer