Как изменить разрешение (DPI) изображения?
У меня есть изображение JPEG с разрешением 72. Я хочу изменить 72 т / д до 300 т / д.
Как я могу изменить разрешение изображений JPEG с помощью C#?
5 ответов
В этой статье говорится об изменении данных EXIF без повторного сохранения / повторного сжатия (и, таким образом, потери информации - на самом деле используется "хитрость"; возможно, существует больше прямых библиотек), необходимых для SetResolution
подход. Это было найдено при быстром поиске в Google, но я хотел отметить, что все, что вам нужно сделать, это изменить сохраненные данные EXIF.
Также: .NET lib для модификации EXIF и еще один вопрос SO. Google владеет, когда вы знаете хорошие условия поиска.
Вы должны скопировать биты на новое изображение с целевым разрешением, например так:
using (Bitmap bitmap = (Bitmap)Image.FromFile("file.jpg"))
{
using (Bitmap newBitmap = new Bitmap(bitmap))
{
newBitmap.SetResolution(300, 300);
newBitmap.Save("file300.jpg", ImageFormat.Jpeg);
}
}
Это просто вопрос увеличения ширины и высоты изображения до правильного соотношения. Не все форматы изображений поддерживают метатег DPI, и когда они это делают, все, что вам нужно сделать для графического программного обеспечения, - это разделить изображение на предоставленное соотношение.
Например, если вы экспортируете изображение с разрешением 300 точек на дюйм из Photoshop в JPEG, изображение будет очень большим при просмотре в программном обеспечении для просмотра изображений. Это связано с тем, что информация DPI не поддерживается в формате JPEG и отбрасывается при сохранении. Это означает, что ваша программа просмотра изображений не знает, на какой коэффициент делить изображение, и вместо этого отображает изображение в соотношении 1:1.
Чтобы получить соотношение, вам нужно масштабировать изображение, см. Код ниже. Просто помните, это растянет изображение, как в Photoshop. По сути, вы в четыре раза увеличиваете размер изображения, поэтому оно будет растягиваться и может создавать артефакты.
Псевдокод
ratio = 300.0 / 72.0 // 4.167
image.width * ratio
image.height * ratio
Этот код с помощью слияния и преобразования 200 дБи
static void Main(string[] args)
{ Path string Outputpath = @"C:\Users\MDASARATHAN\Desktop\TX_HARDIN_10-01-2016_K";
string[] TotalFiles = Directory.GetFiles(Outputpath, "*.tif", SearchOption.AllDirectories);
foreach (string filename in TotalFiles)
{
Bitmap bitmap = (Bitmap)Image.FromFile(filename);
string ExportFilename = string.Empty;
int Pagecount = 0;
bool bFirstImage = true;
bitmap.SetResolution(200, 200);
ExportFilename = Path.GetDirectoryName(filename) + "\\" + Path.GetFileName(filename)+"f";
MemoryStream byteStream = new MemoryStream();
Pagecount = bitmap.GetFrameCount(FrameDimension.Page);
if (bFirstImage)
{
bitmap.Save(byteStream, ImageFormat.Tiff);
bFirstImage = false;
} Image tiff = Image.FromStream(byteStream);
ImageCodecInfo encoderInfo = ImageCodecInfo.GetImageEncoders().First(i => i.MimeType == "image/tiff");
EncoderParameters encoderParams = new EncoderParameters(2);
EncoderParameter parameter = new EncoderParameter(System.Drawing.Imaging.Encoder.Compression, (long)EncoderValue.CompressionCCITT4);
encoderParams.Param[0] = parameter;
parameter = new EncoderParameter(System.Drawing.Imaging.Encoder.SaveFlag, (long)EncoderValue.MultiFrame);
encoderParams.Param[1] = parameter;
// bitmap.Dispose();
try
{
tiff.Save(ExportFilename, encoderInfo, encoderParams);
}
catch (Exception ex)
{
}
EncoderParameters EncoderParams = new EncoderParameters(2);
EncoderParameter SaveEncodeParam = new EncoderParameter(System.Drawing.Imaging.Encoder.SaveFlag, (long)EncoderValue.FrameDimensionPage);
EncoderParameter CompressionEncodeParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Compression, (long)EncoderValue.CompressionCCITT4);
EncoderParams.Param[0] = CompressionEncodeParam;
EncoderParams.Param[1] = SaveEncodeParam;
if (bFirstImage == false)
{
for (int i = 1; i < Pagecount; i++)
{
//bitmap = (Bitmap)Image.FromFile(filenames);
byteStream = new MemoryStream();
bitmap.SelectActiveFrame(FrameDimension.Page, i);
bitmap.Save(byteStream, ImageFormat.Tiff);
bitmap.SetResolution(200, 200);
tiff.SaveAdd(bitmap, EncoderParams);
}
} SaveEncodeParam = new EncoderParameter(System.Drawing.Imaging.Encoder.SaveFlag, (long)EncoderValue.Flush);
EncoderParams = new EncoderParameters(1);
EncoderParams.Param[0] = SaveEncodeParam;
tiff.SaveAdd(EncoderParams);
tiff.Dispose();
bitmap.Dispose();
File.Delete(filename);
}
}
DPI не следует хранить в файле растрового изображения, так как большинство источников данных для растровых изображений делают его бессмысленным.
Растровое изображение сохраняется в виде пикселей. Пиксели не имеют собственного размера в любом отношении. Только во время рендеринга - будь то монитор, принтер или автоматическая машина для сшивания - это имеет значение DPI.
Растровое изображение с разрешением 800x1000 пикселей, напечатанное с разрешением 100 точек на дюйм, превращается в красивую фотографию 8x10". При печати с разрешением 200 точек на дюйм растровое изображение EXACT SAME превращается в изображение 4x5".
Захват изображения с помощью цифровой камеры, и что означает DPI? Это, конечно, не размер области, сфокусированной на томографе ПЗС - это зависит от расстояния, и НАСА возвращает изображения галактик, которые имеют ширину 100 000 световых лет и 2 миллиона световых лет друг от друга, в том же поле зрения, какого рода DPI ты получаешь от ЭТОЙ информации?
Не становитесь жертвой идеи DPI растрового изображения - это ошибка. Растровое изображение не имеет физических размеров (за исключением нескольких микрометров места в ОЗУ или на жестком диске). Это только отображаемое изображение или напечатанное изображение, которое имеет физический размер в дюймах, или миллиметрах, или фарлонгах.