уменьшенное изображение, вырезать изменить размер и загрузить в БД - PullRequest
2 голосов
/ 17 августа 2010

Я использую этот код для создания миниатюр, а затем сохраняю оригинал и миниатюру в БД.Он создает tn, которые всегда имеют фиксированный размер, и если исходное изображение более сухое, чем оно выше, оно обрезается, а затем изменяется до фиксированного размера.

Код работает, однако я был бы очень признателен за помощь в изменении этогокод, чтобы сделать следующее (я пробовал, но не удалось):

  • Сделать высококачественные миниатюры

  • сократить высоту, еслиизображение намного выше
    , чем его ширина (если ширина
    200px и высота 1000px, что произойдет?)

  • Примите png и tiff.

Это код на данный момент:

    public void imgUpload()
    {
        if (ImgUpload.PostedFile != null)
        {
            System.Drawing.Image image_file = System.Drawing.Image.FromStream(ImgUpload.PostedFile.InputStream);
            string fileName = Server.HtmlEncode(ImgUpload.FileName);
            string extension = System.IO.Path.GetExtension(fileName);

            bool sizeError = false;

            if(image_file.Width < 200)
                sizeError = true;

            if(image_file.Height < 250)
                sizeError = true;

            if ((extension.ToUpper() == ".JPG") && !sizeError)
            {

                //**** Resize image section ****  
                int image_height = image_file.Height;
                int image_width = image_file.Width;
                int original_width = image_width;
                int original_height = image_height;
                int max_height = 250;
                int max_width = 200;

                Rectangle rect;

                if (image_width > image_height)
                {
                    image_width = (image_width * max_height) / image_height;
                    image_height = max_height;
                    rect = new Rectangle(((image_width - max_width) / 2), 0, max_width, max_height);
                }
                else
                {
                    image_height = (image_height * max_width) / image_width;
                    image_width = max_width;
                    rect = new Rectangle(0, ((image_height - max_height) / 2), max_width, max_height);
                }

                Bitmap bitmap_file = new Bitmap(image_file, image_width, image_height);
                Bitmap new_bitmap_file = bitmap_file.Clone(rect, bitmap_file.PixelFormat);

                System.IO.MemoryStream stream = new System.IO.MemoryStream();

                new_bitmap_file.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg);
                stream.Position = 0;

                byte[] imageThumbnail = new byte[stream.Length + 1];
                stream.Read(imageThumbnail, 0, imageThumbnail.Length);

                Bitmap Original_bitmap_file = new Bitmap(image_file, original_width, original_height);
                System.IO.MemoryStream Original_stream = new System.IO.MemoryStream();

                Original_bitmap_file.Save(Original_stream, System.Drawing.Imaging.ImageFormat.Jpeg);
                Original_stream.Position = 0;

                byte[] imageOriginal = new byte[Original_stream.Length + 1];
                Original_stream.Read(imageOriginal, 0, imageOriginal.Length);
                //**** End resize image section ****  

                saveImage(imageThumbnail, imageOriginal, IDTextBox.Text);
                lblOutput.Visible = false;
            }
            else
            {
                lblOutput.Text = "Please only upload .jpg files and make sure the size is minimum 200x250";
                lblOutput.Visible = true;
            }
        }
        else
        {
            lblOutput.Text = "No file selected";
            lblOutput.Visible = true;
        }
    }

Ответы [ 2 ]

1 голос
/ 27 августа 2010

Я использую следующий код при создании миниатюр для http://www.inventerat.se и нескольких других сайтов, и он работает как шарм:

    public static Bitmap WithinMaxSize(Image imgPhoto, int maxWidth, int maxHeight)
    {
        int sourceWidth = imgPhoto.Width;
        int sourceHeight = imgPhoto.Height;

        int destWidth;
        int destHeight;

        float sourceAspect = sourceWidth / (sourceHeight * 1.0F);
        float maxAspect = maxWidth / (maxHeight * 1.0F);
        if (sourceAspect > maxAspect)
        {
            // Width is limiting.
            destWidth = maxWidth;
            destHeight = (int)Math.Round(destWidth / sourceAspect);
        }
        else
        {
            // Height is limiting.
            destHeight = maxHeight;
            destWidth = (int)Math.Round(destHeight * sourceAspect);
        }

        Bitmap bmPhoto = new Bitmap(destWidth, destHeight);

        Graphics grPhoto = Graphics.FromImage(bmPhoto);
        grPhoto.Clear(Color.White);
        grPhoto.CompositingMode = CompositingMode.SourceCopy;
        grPhoto.CompositingQuality = CompositingQuality.HighQuality;
        grPhoto.InterpolationMode = InterpolationMode.HighQualityBicubic;

        grPhoto.DrawImage(imgPhoto, 0, 0, destWidth, destHeight);

        grPhoto.Dispose();
        return bmPhoto;
    }

Просто не забудьте утилизировать растровое изображение, возвращенное изэтот метод.

Это не очень хорошо работает, если пользователи загружают очень большие изображения (например,> 5000 * 5000 пикселей).Если это требование, я бы порекомендовал использовать ImageMagick или аналогичный пакет обработки изображений.

Чтобы принимать png и tiff, просто измените способ проверки расширения файла, чтобы принимать «png», «tif» и «TIFF ", а также.Поддержка tiff немного отрывочна в .NET, так как сама tiff является лишь контейнером для МНОГИХ различных кодировок.

1 голос
/ 17 августа 2010

Вот пример того, как масштабировать и обрезать изображение:

Bitmap b = new Bitmap(200, 1000);
using (var g = Graphics.FromImage(b))
{
    g.DrawLine(Pens.White, 0, 0, b.Width, b.Height);
}
b.Save("b.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);

Bitmap thumb = new Bitmap(100, 100);
using (var g = Graphics.FromImage(thumb))
{
    g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
    g.DrawImage(b, new Rectangle(0,0,100,100), new Rectangle(0, 400, 200, 200), GraphicsUnit.Pixel);
}
thumb.Save("thumb.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);

Я думаю, что вы можете адаптировать код ко всему, что и когда, когда соотношение высота / ширина слишком велико и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...