【问题标题】:Change DPI of Image object [closed]更改图像对象的 DPI [关闭]
【发布时间】:2017-05-09 10:43:16
【问题描述】:

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

我有一个 Windows 服务,它需要一些 TIFF 并执行一些与条形码相关的操作。除此之外,最后我从单页 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 和 Horizo​​ntalResolution 300。 变成 96x96 之后。

如何更改这些图像属性以获得 300 DPI 的图像?


使用 SetResolution 方法设置原始 Xdpi 和 Ydpi 已解决,新 Bitmap 对象的默认 DPI 为 96x96,如下面的答案所示。

【问题讨论】:

  • 通过提供minimal reproducible example 向我们展示您的尝试,我们可以为您提供相应的帮助。
  • 你为什么要这样做?你确定你understand what this property actually does?不管怎样,你应该可以打电话给SetResolution
  • 原始 VerticalResolution 和 Horizo​​ntalResolution 设置为 300、300。我的代码将图像缩放到不需要的 96x96。我想解决这个问题
  • 请不要调用您刚刚从“我的代码”某处复制的代码。你显然不知道这段代码做了什么,为什么它会这样做......
  • 我想你们对反射有点苛刻。我遇到了类似的问题 - 感谢您提出问题反射。

标签: c# image-processing bitmap dpi


【解决方案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);

【讨论】:

  • 我终于看到了。
  • 由于该函数不止一次地创建了一个新的位图对象,并且自从它第一次使用 SetResolution 方法重新分配原始 DPI 以来,我认为它甚至会在第二次重新分配它以保留原始 DPI。此代码来自具有 CPOL 1.02 许可证的项目。在我的项目中使用它有什么问题?你知道你的代码的每一个依赖的每一行吗?你不是从不假设别人的代码是做什么的吗?
  • @refex 不,但我不称它为“我的代码”,而且我通常不会提出堆栈溢出问题,这些问题可以通过以下方式轻松回答:a) 阅读前面的 10 行代码我和/或 b) 通过阅读我想要更改其属性的类的参考手册。如果您的代码没有按照您的预期执行,您不能只是做出假设。阅读它,尝试理解每一行。记笔记...我的意思是,当您的输出具有意外的分辨率时,发现您只为“源”设置分辨率而不为“目标”设置分辨率有多难?你不需要成为程序员。
  • 你说得对,考虑到我从几周前开始学习这门语言,而且我以前从未使用过这个类,也没有处理过图像文件,所以需要一些时间来了解在哪里看。事实上,知道有一个 SetResolution 方法帮助我调试了代码(不是 10 行 :))还是谢谢你
  • @refex 只是学习尽可能参考参考文档。我既不知道 C#,也不知道该类或其任何函数。但我知道如何获取信息。
猜你喜欢
  • 1970-01-01
  • 2011-06-13
  • 1970-01-01
  • 1970-01-01
  • 2015-07-09
  • 1970-01-01
  • 1970-01-01
  • 2013-10-19
  • 2011-05-24
相关资源
最近更新 更多