2010-12-13 10 views
15

У меня есть изображение в формате JPEG с DPI 72. Я хочу изменить 72 dpi на 300 dpi.Как изменить разрешение (DPI) изображения?

Как я могу изменить разрешение изображений JPEG с помощью C#?

+2

DPI относительна - обычно имеет смысл только в том, как оно отображается (например, принтер или экран), или когда он считывается (например, от сканер). Сохранение DPI в этих случаях позволяет, например, производить точный размер. Данные [EXIF] (http://en.wikipedia.org/wiki/Exchangeable_image_file_format), которые могут храниться в изображениях JPEG (но не 2k), находятся там, где хранится информация DPI. – 2010-12-13 09:25:04

ответ

6

This article переговоры о модификации EXIF data без ПЕРЕУСТАНОВКИ сохранение и повторное сжатие (и, следовательно, потеря информации - на самом деле он использует «трюк», может быть больше прямых библиотек), требуемых подходом SetResolution. Это было обнаружено при быстром поиске в google, но я хотел указать, что вам нужно , чтобы сделать, это изменить сохраненные данные EXIF.

Also: .NET lib for EXIF modification и еще SO question. Google владеет, когда вы знаете хорошие условия поиска.

4

Это просто вопрос масштабирования ширины и высоты изображения по правильному отношению. Не все форматы изображений поддерживают метатаг DPI, и, когда они это делают, все, что они говорят вашему графическому программному обеспечению, - это разделение изображения по предоставленному соотношению.

Например, если вы экспортируете 300-пиксельное изображение из Photoshop в JPEG, изображение будет очень большим при просмотре в вашем программном обеспечении для просмотра изображений. Это связано с тем, что информация DPI не поддерживается в JPEG и отбрасывается при сохранении. Это означает, что ваш просмотрщик изображений не знает, какое отношение разделит изображение, и вместо этого отобразит изображение со соотношением 1: 1.

Чтобы получить соотношение, необходимое для масштабирования изображения, см. Код ниже. Просто помните, что этот будет растянуть изображение, точно так же, как в Photoshop. Вы существенно увеличиваете размер изображения, увеличивая размер изображения, и он может создавать артефакты.

код Псевдо

ratio = 300.0/72.0 // 4.167 
image.width * ratio 
image.height * ratio 
38

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

using (Bitmap bitmap = (Bitmap)Image.FromFile("file.jpg")) 
    { 
     using (Bitmap newBitmap = new Bitmap(bitmap)) 
     { 
      newBitmap.SetResolution(300, 300); 
      newBitmap.Save("file300.jpg", ImageFormat.Jpeg); 
     } 
    } 
+0

Следует также упомянуть, что в случае JPEG сохранение в новый файл приведет к дополнительным потерям сжатия –

+0

Абсолютно, мы можем наблюдать, что файл становится все меньше и меньше каждый раз –

+9

Есть ли причина, по которой вы должны * скопировать * растровое изображение а не просто вызвать «SetResolution» на оригинале? –

-1

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

Растровое изображение хранится в виде пикселей. В любом случае пиксели не имеют определенного размера. Это только во время рендеринга - будь то монитор, принтер или автоматическая машина для перекрестного скрещивания - что имеет значение DPI.

800x1000 пикселей растровое изображение, напечатанное на 100 точек на дюйм, превращается в хороший 8x10" фото. Отпечатано в 200 точек на дюйм, то Таже растровое изображение превращается в 4х5" фото.

Захват изображения с помощью цифровой камеры и что означает DPI? Это, конечно, не размер области, ориентированной на ПЗС-матрицу, которая зависит от расстояния, а с НАСА возвращаются изображения галактик, которые на 100 000 световых лет в поперечнике и на расстоянии 2 миллиона световых лет в той же области зрения, какой вид от DPI вы получаете от THAT информации?

Не становитесь жертвой идеи DPI растрового изображения - это ошибка. Растровое изображение не имеет физических размеров (за исключением нескольких микрометров пространства для хранения в ОЗУ или жестком диске). Это только отображаемое изображение или напечатанное изображение с физическим размером в дюймах или миллиметрах, или на длинных.

+4

DPI хранится в растровых форматах, таких как JPEG и PNG. –

+6

DPI используется для интерпретации физического значения пикселей. Таким образом, ваша информация правильная, и ваше заключение неверно. DPI полезен и часто необходим для работы с растровыми файлами. – TaW

-2

Этот код с помощью слияния и преобразования 200 DBI

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); 

      } 


     } 
+2

вы можете объяснить, как это решит проблему? – Phani

+1

Этот код объясняет, как объединить кучу одностраничных изображений TIFF в многостраничный TIFF; он вообще не связан с вопросом. –

Смежные вопросы