C #: сохранение битов на плоскости при изменении размеров изображений - PullRequest
1 голос
/ 27 сентября 2010

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

Проблема, с которой я столкнулся, заключается в том, что миниатюра «весит» намного больше, чем исходный файл, пропорционально. Когда я проверяю основные свойства каждого файла (в XnView), я вижу, что исходные файлы, например, сохраняются с 32 битами на плоскость, тогда как исходный файл будет иметь, например, только 24 бит на плоскость.

Каков будет правильный способ сделать копию исходного файла, все еще используя сжатие? Это выдержка из кода:

private void ResizeImage(string originalFile, string NewFile, int NewWidth, int MaxHeight, bool OnlyResizeIfWider, string directory)
    {
        System.Drawing.Image FullsizeImage = System.Drawing.Image.FromFile(originalFile);

        // Prevent using images internal thumbnail
        FullsizeImage.RotateFlip(System.Drawing.RotateFlipType.Rotate180FlipNone);
        FullsizeImage.RotateFlip(System.Drawing.RotateFlipType.Rotate180FlipNone);

        if (OnlyResizeIfWider)
        {
            if (FullsizeImage.Width <= NewWidth)
            {
                NewWidth = FullsizeImage.Width;
            }
        }

        int NewHeight = FullsizeImage.Height * NewWidth / FullsizeImage.Width;
        if (NewHeight > MaxHeight)
        {
            // Resize with height instead
            NewWidth = FullsizeImage.Width * MaxHeight / FullsizeImage.Height;
            NewHeight = MaxHeight;
        }

        System.Drawing.Image NewImage = FullsizeImage.GetThumbnailImage(NewWidth, NewHeight, null, IntPtr.Zero);

        // Clear handle to original file so that we can overwrite it if necessary
        FullsizeImage.Dispose();

        // Save resized picture
        NewImage.Save(directory + Path.DirectorySeparatorChar + NewFile);
    }

Ответы [ 2 ]

0 голосов
/ 27 сентября 2010

Вместо того, чтобы вызывать GetThumbnailImage, вы можете создать новое изображение нужного вам размера и PixelFormat, которое вы хотите, а затем масштабировать исходное изображение в этом.

System.Drawing.Image FullsizeImage = System.Drawing.Image.FromFile(originalFile);

// Create a bitmap that's NewWidth x NewHeight
Bitmap bmp = new Bitmap(NewWidth, NewHeight, PixelFormat.Format24bppRgb);

// Get a Graphics object for that image and draw the original image into it
using (Graphics g = Graphics.FromImage(bmp))
{
    g.DrawImage(FullsizeImage, 0, 0, NewWidth, NewHeight);
}

// you now have a 24bpp thumbnail image
0 голосов
/ 27 сентября 2010

Я бы посоветовал вам сохранить изображение в виде потока PNG или JPEG.Это будет намного эффективнее.Учитывая, что миниатюра не является исходными данными, вероятно, можно применить к ней сильное сжатие (QF <60).Однажды мне удалось получить полезные изображения в формате JPEG размером менее 1000 байт.В этот момент они настолько малы, что вы можете поместить их в базу данных, а не на диск.</p>

РЕДАКТИРОВАТЬ: (после полного прочтения вопроса :))

И чтобы ответить на вопрос, результат GetThumbnailForImage() снова равен Image, поэтому вы можете вызвать метод Save вэто, одна из перегрузок позволяет вам указать, какое сжатие использовать.

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