Создать миниатюру и уменьшить размер изображения - PullRequest
8 голосов
/ 26 марта 2009

У меня очень большие изображения (jpg), и я хочу написать программу csharp для циклического просмотра файлов и уменьшения размера каждого изображения на 75%.

Я пробовал это:

Image thumbNail = image.GetThumbnailImage(800, 600, null, new IntPtr());

но размер файла все еще очень велик.

Есть ли в любом случае, чтобы создавать эскизы и размер файла будет намного меньше?

Ответы [ 5 ]

18 голосов
/ 26 марта 2009
private void CompressAndSaveImage(Image img, string fileName, 
        long quality) {
    EncoderParameters parameters = new EncoderParameters(1);
    parameters.Param[0] = new EncoderParameter(Encoder.Quality, quality);
    img.Save(fileName, GetCodecInfo("image/jpeg"), parameters);
}

private static ImageCodecInfo GetCodecInfo(string mimeType) {
    foreach (ImageCodecInfo encoder in ImageCodecInfo.GetImageEncoders())
        if (encoder.MimeType == mimeType)
            return encoder;
    throw new ArgumentOutOfRangeException(
        string.Format("'{0}' not supported", mimeType));
}

Использование:

Image myImg = Image.FromFile(@"C:\Test.jpg");
CompressAndSaveImage(myImg, @"C:\Test2.jpg", 10);

Это сожмет Test.jpg с качеством 10 и сохранит его как Test2.jpg.

РЕДАКТИРОВАТЬ: Может быть лучше как метод расширения:

private static void SaveCompressed(this Image img, string fileName, 
        long quality) {
    EncoderParameters parameters = new EncoderParameters(1);
    parameters.Param[0] = new EncoderParameter(Encoder.Quality, quality);
    img.Save(fileName, GetCodecInfo("image/jpeg"), parameters);
}

Использование:

Image myImg = Image.FromFile(@"C:\Test.jpg");
myImg.SaveCompressed(@"C:\Test2.jpg", 10);
2 голосов
/ 13 мая 2009

ImageMagick - инструмент командной строки, чрезвычайно мощный для манипулирования изображениями. Я использовал его для изменения размера больших изображений и создания миниатюр в тех случаях, когда соотношение сторон исходного изображения неизвестно или ненадежно. ImageMagick может изменять размер изображения до определенной высоты или ширины, сохраняя при этом исходное соотношение сторон изображения. Он также может добавить пространство вокруг изображения, если требуется. В целом очень мощная и хорошая абстракция от необходимости иметь дело с .nets Image API. Чтобы использовать инструмент командной строки imageMagick из C #, я рекомендую использовать объект System.Diagnostics.ProcessStartInfo, например:

ProcessStartInfo psi = new ProcessStartInfo();
psi.FileName = @"C:\Program Files\ImageMagick-6.5.0-Q16\convert.exe";
psi.UseShellExecute = false;
psi.RedirectStandardOutput = true;
psi.RedirectStandardError = true;
psi.Arguments = string.Format("-size x{0} \"{1}\" -thumbnail 200x140 -background transparent -gravity center -extent 200x140 \"{2}\"", heightToResizeTo, originalTempFileLocation, resizedTempFileLocation);

Process p = new Process();
p.StartInfo = psi;
p.Start();
p.WaitForExit();

Используя шкалу% paramater, вы можете легко уменьшить размер вашего изображения на 75%

1 голос
/ 26 марта 2009

Сжатие вашего изображения. Для миниатюр достаточно JPEG, так как вы не ищете качество.

Image thumbNail = image.GetThumbnailImage(800, 600, null, new IntPtr());

thumbNail.Save(fileName, ImageFormat.Jpeg);
0 голосов
/ 27 мая 2019

Этот метод мне очень помог. Малый размер изображения, поддерживает соотношение сторон

 ShellFile shellFile = ShellFile.FromFilePath(ImageWithPath); //original image path
 Bitmap shellThumbSmall = shellFile.Thumbnail.ExtraLargeBitmap; //change image size
 shellThumbSmall.Save(ImageWithPathThumbnail, ImageFormat.Jpeg); // new image path and format

Это необходимо

PM> Install-Package WindowsAPICodePack-Core
PM> Install-Package WindowsAPICodePack-Shell

using Microsoft.WindowsAPICodePack.Shell;
using Microsoft.WindowsAPICodePack;
0 голосов
/ 26 марта 2009

Из документации GetThumbnailImage:

Если изображение содержит встроенное миниатюру, этот метод извлекает встроенную миниатюру и масштабирует ее до требуемого размера. Если изображение не содержит встроенного миниатюры, этот метод создает миниатюру изображения путем масштабирования основного изображения.

Я бы посоветовал вам использовать меньшие значения ширины и высоты. Попробуйте:

// reduce the size of each image by 75% from original 800x600
Image thumbNail = image..GetThumbnailImage(200, 150, null, IntPtr.Zero);

См. образец код.

Также ознакомьтесь с документацией:

Метод GetThumbnailImage хорошо работает, когда запрашиваемое уменьшенное изображение имеет размер примерно 120 x 120 пикселей. Если вы запрашиваете большое миниатюрное изображение (например, 300 x 300) у изображения с внедренным миниатюром, это может привести к заметной потере качества миниатюрного изображения. Возможно, лучше масштабировать основное изображение (вместо масштабирования встроенного эскиза), вызвав метод DrawImage.

Думаю, вы захотите взглянуть на API масштабирования.

...