2

我有一个图像上传表单,它存储两种尺寸的图像:大图像和缩略图图像。

对于缩略图图像,我试图从中心裁剪图像并将大小重新调整为:30px x 30px。

这是我的代码:

    private static Bitmap ResizeImage(MemoryStream uploadStream, int maxWidth, int maxHeight)
    {
        Image img = Image.FromStream(uploadStream);

        double ratioX = (double)maxWidth / img.Width;
        double ratioY = (double)maxHeight / img.Height;
        double ratio = Math.Max(ratioX, ratioY);

        int newWidth = (int)(img.Width * ratio);
        int newHeight = (int)(img.Height * ratio);

        Bitmap resizedBitmap = new Bitmap(newWidth, newHeight);
        Graphics.FromImage(resizedBitmap).DrawImage(img, 0, 0, newWidth, newHeight);

        img.Dispose();

        return resizedBitmap;
    }

    private static Bitmap CropImageToCentre(MemoryStream uploadStream, int width, int height)
    {
        Image img = Image.FromStream(uploadStream);
        Bitmap resizedBitmap = new Bitmap(img); 

        int StartX = 0, StartY = 0;
        int EndX = img.Width, EndY = img.Height;
        bool Crop = false;

        if (img.Width > width)
        {
            int MidX = img.Width / 2;
            StartX = MidX - (width / 2);
            EndX = MidX + (width / 2);
            Crop = true;
        }

        if (img.Width > height)
        {
            int MidY = img.Height / 2;
            StartY = MidY - (height / 2);
            EndY = MidY + (height / 2);
            Crop = true;
        }

        if (Crop)
        {
            Size imgSize = new Size(width, height);
            resizedBitmap = new Bitmap(img, imgSize);
        }

        img.Dispose();

        return resizedBitmap;
    }

    public static Bitmap ResizeThumbnail(MemoryStream ms)
    {
        int thumbWidth = int.Parse(ConfigurationManager.AppSettings["thumbwidth"]);
        int thumbHeight = int.Parse(ConfigurationManager.AppSettings["thumbheight"]);

        return CropImageToCentre(BitmapToMemoryStream(ResizeImage(ms, thumbWidth, thumbHeight)), thumbWidth, thumbHeight);
    }

    public static Bitmap ResizeLargeImage(MemoryStream ms)
    {
        int width = int.Parse(ConfigurationManager.AppSettings["largewidth"]);
        int height = int.Parse(ConfigurationManager.AppSettings["largeheight"]);

        return ResizeImage(ms, width, height);
    }

    private static MemoryStream BitmapToMemoryStream(Bitmap bm)
    {
        MemoryStream memoryStream = new MemoryStream();
        bm.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Jpeg);

        return memoryStream;
    }

我遇到的问题是在调用该ResizeThumbnail()方法时,图像没有被裁剪或调整为 30px 的高度和宽度。

4

2 回答 2

1

发现问题。我已将CropImageToCentre方法更新为以下内容:

private static Bitmap CropImageToCentre(MemoryStream uploadStream, int width, int height)
{
    Image img = Image.FromStream(uploadStream);
    Bitmap resizedBitmap = new Bitmap(img); 

    int StartX = 0, StartY = 0;
    int EndX = img.Width, EndY = img.Height;
    bool Crop = false;

    if (img.Width > width)
    {
        int MidX = img.Width / 2;
        StartX = MidX - (width / 2);
        EndX = MidX + (width / 2);
        Crop = true;
    }

    if (img.Height > height)
    {
        int MidY = img.Height / 2;
        StartY = MidY - (height / 2);
        EndY = MidY + (height / 2);
        Crop = true;
    }

    if (Crop)
    {
        Bitmap cropped = new Bitmap(width, height);
        Graphics.FromImage(cropped).DrawImage(img, new Rectangle(0, 0, width, height), new Rectangle(StartX, StartY, EndX, EndY), GraphicsUnit.Pixel);
        resizedBitmap = cropped;
    }

    return resizedBitmap;
}
于 2013-04-02T09:35:33.750 回答
0

可以有多种解决方案,可能是这样的,请参阅此功能

     private Size getScaledImageDimensions(int currentImageWidth,int currentImageHeight,
                                            int desiredImageWidth,int desiredImageHeight)
    {
        /* First, we must calculate a multiplier that will be used

        * to get the dimensions of the new, scaled image.
        */

        double scaleImageMultiplier = 0;

        /* This multiplier is defined as the ratio of the

        * Desired Dimension to the Current Dimension.
        * Specifically which dimension is used depends on the larger
        * dimension of the image, as this will be the constraining dimension
        * when we fit to the window.
        */

        /* Determine if Image is Portrait or Landscape. */
        if (currentImageHeight > currentImageWidth)    /* Image is Portrait */
        {
            /* Calculate the multiplier based on the heights. */
            if (desiredImageHeight > desiredImageWidth)
            {
                scaleImageMultiplier = (double)desiredImageWidth / (double)currentImageWidth;
            }

            else
            {
                scaleImageMultiplier = (double)desiredImageHeight / (double)currentImageHeight;
            }
        }

        else /* Image is Landscape */
        {
            /* Calculate the multiplier based on the widths. */
            if (desiredImageHeight >= desiredImageWidth)
            {
                scaleImageMultiplier = (double)desiredImageWidth / (double)currentImageWidth;
            }

            else
            {
                scaleImageMultiplier = (double)desiredImageHeight / (double)currentImageHeight;
            }
        }

        /* Generate and return the new scaled dimensions.

        * Essentially, we multiply each dimension of the original image
        * by the multiplier calculated above to yield the dimensions
        * of the scaled image. The scaled image can be larger or smaller
        * than the original.
        */

        return new Size(
        (int)(currentImageWidth * scaleImageMultiplier),
        (int)(currentImageHeight * scaleImageMultiplier));
    }//end of fun

   // you can call it like this
   {
         Image tempImage = (Image)<someImageSource....>;

                    /* Calculate the dimensions necessary for an image to fit. */
                    Size fitImageSize = this.getScaledImageDimensions(
                    current_Width, current_Height, desired_Width, desired_Height);
         Bitmap imgOutput = new Bitmap(tempImage, fitImageSize.Width, fitImageSize.Height);
   }

//代码结尾对我有用,不好识别

于 2013-04-02T09:33:23.270 回答