2010-12-13 62 views
15

Tôi có ảnh JPEG có DPI là 72. Tôi muốn thay đổi 72 dpi thành 300 dpi.Làm thế nào để thay đổi độ phân giải (DPI) của một hình ảnh?

Làm cách nào để thay đổi độ phân giải của ảnh JPEG bằng C#?

+2

DPI là tương đối - nó thường làm cho tinh thần duy nhất trong cách nó được trả lại (ví dụ với máy in hoặc màn hình) hoặc khi nó được đọc trong (ví dụ từ Một máy quét). Ví dụ, việc lưu DPI trong những trường hợp này cho phép tạo một bản sao có kích thước chính xác. Dữ liệu [EXIF] (http://en.wikipedia.org/wiki/Exchangeable_image_file_format) có thể được lưu trữ bên trong hình ảnh JPEG (nhưng không phải 2k) là nơi lưu trữ thông tin DPI. –

Trả lời

6

This article cuộc đàm phán về việc sửa đổi EXIF data mà không có sự tái tiết kiệm/nén lại (và do đó mất thông tin - nó thực sự sử dụng một "thủ thuật"; có thể có nhiều thư viện trực tiếp hơn) theo yêu cầu của phương pháp SetResolution. Điều này đã được tìm thấy trên một tìm kiếm google nhanh chóng, nhưng tôi muốn chỉ ra rằng tất cả các bạn cần để làm là sửa đổi dữ liệu EXIF ​​được lưu trữ.

Also: .NET lib for EXIF modification và một SO question khác. Google sở hữu khi bạn biết các cụm từ tìm kiếm tốt.

4

Chỉ đơn giản là vấn đề chia tỷ lệ chiều rộng và chiều cao của hình ảnh lên theo tỷ lệ chính xác. Không phải tất cả các định dạng hình ảnh đều hỗ trợ thẻ siêu dữ liệu DPI và khi chúng thực hiện, tất cả những gì chúng nói cho phần mềm đồ họa của bạn làm là chia hình ảnh theo tỷ lệ được cung cấp.

Ví dụ: nếu bạn xuất hình ảnh 300dpi từ Photoshop sang JPEG, hình ảnh sẽ xuất hiện rất lớn khi được xem trong phần mềm xem hình ảnh của bạn. Điều này là do thông tin DPI không được hỗ trợ trong JPEG và bị loại bỏ khi được lưu. Điều này có nghĩa là người xem hình ảnh của bạn không biết tỷ lệ nào để chia hình ảnh và thay vào đó hiển thị hình ảnh ở tỷ lệ 1: 1.

Để nhận tỷ lệ bạn cần để chia tỷ lệ hình ảnh theo, hãy xem mã bên dưới. Chỉ cần nhớ rằng, này sẽ làm giãn hình ảnh, giống như trong Photoshop. Bạn đang cơ bản tăng gấp bốn lần kích thước của hình ảnh để nó sẽ kéo dài và có thể tạo ra hiện vật.

Pseudo code

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

Bạn phải sao chép các bit trên một hình ảnh mới với độ phân giải mục tiêu, như thế này:

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

Bạn cũng nên đề cập rằng trong trường hợp JPEG, việc lưu vào một tệp mới sẽ gây ra tổn thất nén bổ sung –

+0

Tuyệt đối, chúng tôi có thể quan sát thấy tệp ngày càng nhỏ hơn mỗi lần –

+9

Có lý do nào bạn phải sao chép * bitmap thay vì chỉ gọi 'SetResolution' trên bản gốc? –

-1

DPI không được lưu trữ trong tệp hình ảnh bitmap, vì hầu hết các nguồn dữ liệu cho bitmap làm cho nó trở nên vô nghĩa.

Hình ảnh bitmap được lưu trữ dưới dạng pixel. Pixel không có kích thước cố hữu trong bất kỳ sự tôn trọng nào. Nó chỉ ở thời gian hiển thị - có thể là màn hình, máy in hoặc máy crossstitching tự động - mà DPI quan trọng.

Hình ảnh bitmap 800x1000 pixel, được in ở 100 dpi, biến thành ảnh đẹp 8x10 ". Được in ở 200 dpi, hình ảnh bitmap CHÍNH XÁC biến thành ảnh 4x5".

Chụp ảnh bằng máy ảnh kỹ thuật số và DPI có ý nghĩa gì? Nó chắc chắn không phải là kích thước của khu vực tập trung vào bộ tạo ảnh CCD - phụ thuộc vào khoảng cách, và với NASA quay trở lại các hình ảnh của các thiên hà có chiều dài 100.000 năm ánh sáng, và cách nhau 2 triệu năm ánh sáng, trong cùng một trường, của DPI bạn nhận được từ thông tin THAT?

Không phải là nạn nhân của ý tưởng về DPI của hình ảnh bitmap - đó là một sai lầm. Một hình ảnh bitmap không có kích thước vật lý (tiết kiệm cho một vài micromet không gian lưu trữ trong RAM hoặc ổ đĩa cứng). Nó chỉ là một hình ảnh được hiển thị, hoặc một hình ảnh được in, có kích thước vật lý tính bằng inch hoặc milimet hoặc dài.

+4

DPI được lưu trữ ở định dạng bitmap như JPEG và PNG. –

+6

DPI được sử dụng để giải thích ý nghĩa vật lý của các pixel. Vì vậy, thông tin của bạn là đúng và kết luận của bạn là sai. DPI rất hữu ích và thường cần thiết để làm việc với các tệp bitmap. – TaW

-2

Mã này sử dụng kết hợp và chuyển đổi 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

bạn có thể giải thích cách thức này giải quyết được vấn đề không? – Phani

+1

Mã này giải thích cách hợp nhất một loạt các hình ảnh TIFF một trang thành một TIFF nhiều trang; nó không xuất hiện liên quan đến câu hỏi nào cả. –

Các vấn đề liên quan