2017-05-09 81 views
-5

我想将VerticalResolution和位图的Horizo​​ntalResolution更改为固定值300更改图像对象的DPI

我有一个Windows服务需要一些TIFF并执行一些条形码相关的操作。除此之外,我从单页页面创建了多页TIFF。

问题是原来的DPI总是300,结果有96 DPI。

即使解析度相同且文件大小不变(考虑附加页面),这似乎是唯一相关的区别。

这是相关的,因为我需要在每个文件300 DPI。

这是我认为原因在于代码,从这里取:https://www.codeproject.com/Articles/16904/Save-images-into-a-multi-page-TIFF-file-or-add-ima

private Bitmap ConvertToBitonal(Bitmap original) 
    { 
     Bitmap source = null; 

     // If original bitmap is not already in 32 BPP, ARGB format, then convert 
     if (original.PixelFormat != PixelFormat.Format32bppArgb) 
     { 
      source = new Bitmap(original.Width, original.Height, PixelFormat.Format32bppArgb); 
      source.SetResolution(original.HorizontalResolution, original.VerticalResolution); 
      using (Graphics g = Graphics.FromImage(source)) 
      { 
       g.DrawImageUnscaled(original, 0, 0); 
      } 
     } 
     else 
     { 
      source = original; 
     } 
    // some stuff here 

    // Create destination bitmap 
      Bitmap destination = new Bitmap(source.Width, source.Height, PixelFormat.Format1bppIndexed); 

    // other stuff 
    } 

调试它,我看到指令之前:

Bitmap destination = new Bitmap(source.Width, source.Height, PixelFormat.Format1bppIndexed); 

位图有VerticalResolution 300水平分辨率300. 它变成96x96。

我该如何改变这些图片属性,以使图片具有300 DPI?


使用SetResolution方法来设置原始Xdpi和Ydpi解决,默认DPI为新的位图对象是96x96的如在下面的答案指出。

+1

显示我们一个[MCVE],我们可以帮助你。 – TheLethalCoder

+0

我们不是在这里为你写代码 – MickyD

+0

我在问是否有方法来设置我不能直接设置的属性。不要为我写代码。我将添加更多信息 – refex

回答

1

该代码创建一个位图目标。位图的分辨率默认为96dpi x 96 dpi。由于没有其他分辨率设置输出文件具有默认分辨率...

您的问题的答案可以在参考手册中找到。

https://msdn.microsoft.com/en-us/library/system.drawing.bitmap(v=vs.110).aspx

https://msdn.microsoft.com/en-us/library/system.drawing.bitmap.setresolution(v=vs.110).aspx

public void SetResolution(
     float xDpi, 
     float yDpi 
    ) 

设置此位图的分辨率。

如果你会明白你提供你试过从某处复制,你会意识到你已经有了答案,你的问题就在你面前的代码...

source.SetResolution(original.HorizontalResolution, original.VerticalResolution); 
+0

我终于看到了它。 – refex

+0

由于该函数不止一次创建一个新的Bitmap对象,并且自从第一次使用SetResolution方法重新分配原始DPI时,我认为即使在第二次保留原始DPI时它也会重新分配它。此代码来自一个使用CPOL 1.02许可证的项目。在我的项目中使用它有什么问题?你知道你的代码的每一个依赖的每一行吗?难道你不想对别人的代码做什么假设吗? – refex

+0

@refex不,但我不称它为“我的代码”,我通常不会问堆栈溢出问题,可以通过以下方式轻松回答:a)读取我面前的10行代码和/或b)阅读我想改变属性的类的参考手册。如果你的代码没有达到你期望的效果,那么你不能只是做出假设。阅读它,尝试理解每一行。记笔记...我的意思是,如果您的输出有意想不到的解决方案时,发现只设置“源”的分辨率而不是“目的地”的分辨率有多难?你不需要成为程序员。 – Piglet