2010-12-13 19 views
15

72 piksele sahip bir JPEG resmim var. 72 dpi - 300 dpi arasında değiştirmek istiyorum.Görüntünün çözünürlüğü (DPI) nasıl değiştirilir?

C# kullanarak JPEG resimlerinin çözünürlüğünü nasıl değiştirebilirim?

+2

DPI görecelidir 200 dbi birleştirme ve dönüştürme kullanarak bu kod - genellikle ya (bir yazıcıya veya ekrana örneğin) sadece oluşturulma biçimini mantıklı ondan (örn okunduğunda bir tarayıcı). DPI'nın bu durumlarda kaydedilmesi, örneğin, tam boyutlu bir çoğaltma yapılmasını sağlar. JPEG (ancak 2k değil) görüntülerde saklanabilen [EXIF] (http://en.wikipedia.org/wiki/Exchangeable_image_file_format) verileri, DPI bilgilerinin saklandığı yerdir. –

cevap

6

This article görüşmelere sokmaya olmadan EXIF data değiştirmeyle ilgili SetResolution yaklaşımının gerektirdiği kaydetme/yeniden sıkıştırma (ve dolayısıyla bilgi kaybı - aslında bir "hile" kullanır; daha doğrudan kütüphaneler olabilir). Bu, hızlı bir google aramada bulundu, ancak 'un numaralı bağlantısına sahip olmanızın, saklanan EXIF ​​verilerini değiştirdiğine dikkat çekmek istedim.

Also: .NET lib for EXIF modification ve başka bir SO question. Google, iyi arama terimlerini bildiğiniz zaman sahip olur. Bitmap'ler için çoğu veri kaynağı anlamsız hale getirdiğinden, bir bitmap görüntü dosyasında DPI saklanmamalıdır.

4

Sadece görüntü genişliğini ve yüksekliğini doğru orana göre ölçeklendirmek meselesi. Tüm resim formatları bir DPI meta etiketini desteklemez, ve yaptıkları zaman, grafik yazılımınızın yapmasını istedikleri, görüntüyü verilen orana böler. Örneğin, bir 300dpi görüntüyü Photoshop'tan bir JPEG'ye dışa aktarırsanız, resim görüntüleme yazılımınızda görüntülendiğinde görüntü çok büyük görünecektir. Bunun nedeni, DPI bilgilerinin JPEG'de desteklenmemesi ve kaydedildiğinde atılmasıdır. Bu, resim görüntüleyicinizin görüntüyü hangi orana bölebileceğini bilmediği ve bunun yerine görüntüyü 1: 1 oranında görüntülediği anlamına gelir.

Görüntüyü ölçeklendirmeniz gereken oranı elde etmek için aşağıdaki kodlara bakın. Unutmayın, bu , görüntüyü, Photoshop'ta olduğu gibi genişletecektir. Görüntünün büyüklüğünü dört katına çıkarıyorsunuz, bu yüzden esnetecek ve eserler üretebilecek.

sözde kod

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

Bunu, hedef çözünürlüğe sahip yeni görüntü üzerinde bit kopyalamak zorunda:

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

Ayrıca JPEG, yeni bir dosya için kaydetme ek sıkıştırma kayıpları –

+0

neden olacağını da belirtmek gerekir, biz dosya her zaman daha küçük ve daha küçük olduğunu gözlemleyebiliriz –

+9

Bitmap * kopyalamak zorunda bir sebep var mı? Orijinalde 'SetResolution' yerine arama yapmak yerine? –

-1

Bir bitmap görüntüsü piksel olarak saklanır. Piksellerin herhangi bir açıdan doğal boyutu yoktur. Sadece render zamanında - izleme, yazıcı veya otomatik çapraz dikiş makinesi olsun - bu DPI önemlidir. 100 dpi çözünürlükte basılan

bir 800x1000 piksel bitmap görüntü, güzel 8x10" dönüşür fotoğrafın. 200 dpi çözünürlükte Baskılı, TAM AYNI bitmap görüntü 4x5" dönüşür fotoğrafın.

Dijital kamera ile bir görüntü yakalayın ve DPI ne anlama geliyor? CCD görüntüleyiciye odaklanan alanın boyutu kesinlikle değil - mesafeye bağlı olarak ve NASA'nın 100.000 ışık yılı boyunca olan gökada görüntülerini geri döndürdüğü ve aynı alanda 2 milyon ışıkyılı bir görüntüde ne tür bir alan olduğu kesinlikle değil. DPI, THAT bilgisinden mi geliyor?

Bir bitmap görüntüsünün DPI fikrine kurban gitme - bu bir hatadır. Bir bitmap görüntüsünün fiziksel boyutları yoktur (RAM veya sabit sürücüde birkaç mikrometre depolama alanı için tasarruf edin). Yalnızca inç veya milimetre veya funda uzunluklarında fiziksel boyutu olan görüntülenen bir görüntü veya basılı bir resim.

+4

DPI, JPEG ve PNG gibi bitmap formatlarında saklanır. –

+6

DPI, piksellerin fiziksel anlamını yorumlamak için kullanılır. Yani bilgilerin doğru ve sonucun yanlış. DPI, bitmap dosyaları ile çalışmak için yararlı ve genellikle gereklidir. – TaW

-2

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

, sorunun nasıl çözüleceğini açıklayabilir misiniz? – Phani

+1

Bu kod, tek sayfalık TIFF görüntülerinin bir çok sayfalı TIFF'e nasıl birleştirileceğini açıklar; hiç soruyla ilgili görünmüyor. –

İlgili konular