- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
你好!
这是我的设置:
我有一个从一系列图像中提取特征的 c# 应用程序。由于数据集的大小(数千张图像)是高度并行化的,这就是为什么我们拥有一台在 Windows7 x64(.NET4 运行时)上运行的带 ssd 的高端机器来完成艰苦的工作。我正在使用 Windows 窗体在 Visual Studio 2008 (.NET3.5) 下的 Windows XP SP3 x86 机器上开发它——顺便说一下,没有机会迁移到 WPF。
编辑 3:这很奇怪,但我想我终于知道发生了什么事。似乎是图像格式的编解码器在两台机器上产生不同的结果!我不知道那里到底发生了什么,但 xp 机器上的解码器产生的结果比 win7 机器上的更合理。遗憾的是,更好的 版本仍在 x86 XP 系统中 :(。我猜唯一的解决方案是将输入图像格式更改为无损格式,如 png 或 bmp(愚蠢的我没有考虑文件首先格式化 :))。
编辑2:感谢你付出的努力。我想我会坚持自己实现一个转换器,这不是我想要的,但我必须以某种方式解决它:)。如果有人正在阅读这篇文章并对我有一些想法,请告诉我。
编辑:在评论中,我被建议为此使用第三方库。我想我自己说得不够清楚,因为我真的不想使用 DrawImage 方法——这只是一个有缺陷的 quickhack 来获得实际工作的 new Bitmap(tmp, ... myPixelFormat)
希望使用一些插值。我想要实现的只是将传入的图像转换为带有一些标准插值的通用 PixelFormat。
我的问题如下。一些源图像采用 Indexed8bpp jpg 格式,与 WinForms 图像处理方式不太协调。因此在我的图像加载逻辑中有一个索引图像检查,它将图像转换为我的应用程序默认格式(例如 Format16bpp),如下所示:
Image GetImageByPath(string path)
{
Image result = null;
using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read))
{
Image tmp = Image.FromStream(fs); // Here goes the same image ...
if (tmp.PixelFormat == PixelFormat.Format1bppIndexed ||
tmp.PixelFormat == PixelFormat.Format4bppIndexed ||
tmp.PixelFormat == PixelFormat.Format8bppIndexed ||
tmp.PixelFormat == PixelFormat.Indexed)
{
// Creating a Bitmap container in the application's default format
result = new Bitmap(tmp.Width, tmp.Height, DefConf.DefaultPixelFormat);
Graphics g = Graphics.FromImage(result);
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
// We need not to scale anything in here
Rectangle drawRect = new Rectangle(0, 0, tmp.Width, tmp.Height);
// (*) Here is where the strange thing happens - I know I could use
// DrawImageUnscaled - that isn't working either
g.DrawImage(tmp, drawRect, drawRect, GraphicsUnit.Pixel);
g.Dispose();
}
else
{
result = new Bitmap(tmp); // Just copying the input stream
}
tmp.Dispose();
}
// (**) At this stage the x86 XP memory image differs from the
// the x64 Win7 image despite having the same settings
// on the very same image o.O
result.GetPixel(0, 0).B; // x86: 102, x64: 102
result.GetPixel(1, 0).B; // x86: 104, x64: 102
result.GetPixel(2, 0).B; // x86: 83, x64: 85
result.GetPixel(3, 0).B; // x86: 117, x64: 121
...
return result;
}
我将问题追溯到 (*)
。我认为 InterpolationMode 与它有关,但我选择它们中的哪一个没有区别,结果无论如何在两个系统上的 (**)
是不同的。我一直在用一些愚蠢的复制和粘贴行调查测试图像数据,以确保以错误的方式访问数据不是问题。
所有图像看起来像这样 Electron Backscatter Diffraction Pattern .实际颜色值略有不同,但它们包含大量信息 - 插值甚至可以增强它。看起来 x86 机器上的合成算法使用 InterpolationMode 属性,而 x64 只是将调色板值展开而不考虑任何插值。
在我对应用程序中的数据实现直方图 View 功能之前,我从未注意到两台机器的输出之间有任何差异。在 x86 机器上,它是平衡的,正如人们从观看图像时所期望的那样。另一方面,x64 机器宁愿提供某种稀疏条形图,表示索引图像数据。它甚至会影响整个应用程序的整体输出数据 - 具有相同数据的两台机器上的输出不同,这不是一件好事。
对我来说,它看起来像是 x64 实现中的一个错误,但那只是我 :-)。我只希望 x64 机器上的图像与 x86 机器上的图像具有相同的值。
如果有人有想法,我会很高兴。多年来我一直在网上寻找类似的行为,但抵抗似乎是徒劳的:)
哦,当心……鲸鱼!
最佳答案
如果您想确保始终以相同的方式完成此操作,则必须编写自己的代码来处理它。幸运的是,这并不太难。
您的 8bpp 图像有一个包含实际颜色值的调色板。您需要读取该调色板并将颜色值(如果我没记错的话,是 24 位)转换为 16 位颜色值。您将在转换中丢失信息,但您已经在转换中丢失信息。至少这样,您将以可预测的方式丢失信息。
将转换后的颜色值(不会超过 256 个)放入可用于查找的数组中。然后……
创建目标位图并调用 LockBits
以获得指向实际位图数据的指针。调用 LockBits
获取指向源位图的位图数据的指针。然后,对于每个像素:
read the source bitmap pixel (8 bytes)
get the color value (16 bits) from your converted color array
store the color value in the destination bitmap
您可以使用 GetPixel
和 SetPixel
来完成此操作,但速度会非常非常慢。
关于c# - Graphics.DrawImage 在 x86 和 x64 上创建不同的图像数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8319053/
我想知道如何在 OCaml 中设置文本大小。我尝试了 Graphics.set_text_size,我猜这应该可以解决问题。 但是无论我输入 set_text_size 200 还是 set_text
我想使用mathematica 为我正在写的书绘制图表。我想在mathematica中画一个图,将其保存为图片,然后将其导入到quarkxpress中,最后将其导出为pdf。 我的问题是最好使用哪种格
在顶层加载 Graphics 模块时,我收到一条错误消息“找不到 graphics.cma”。 我使用的是 OS X,而且我很确定我已经正确安装了 OCaml,因为我已经使用了大约一个月了。所以看起来
我知道 DDS 文件的存在,允许在 as/400 上对显示图形进行编程,但是还有其他方法吗? 具体来说,我想要做的是直接操作终端缓冲区,以便能够显示除文本之外的任何其他内容。例如,终端如下所示: 假设
Graphics.Save 与 Graphics.BeginContainer 有何不同? 最佳答案 看看here : The documentation does not differentiate
由于 Gdiplus::Graphics::DrawGraphics(Graphics*, x, y) 不存在,执行此类操作的最佳方法是什么? 例如,创建一个 Graphics 对象,使用各种 Dra
你能看出这有什么问题吗: (define (box d x1 y1 x2 y2) ( (graphics-draw-line d x1 y
我想编写一个 2D 游戏引擎。我遇到的问题(我不使用opengl之类的东西,所以我用cpu渲染)是,我通过graphics.drawImage()只得到7fps;您有任何加快速度的建议或其他替代方案吗
我在某些代码中发现了渲染错误,并找到了解决方法,但我想知道为什么我会得到不同的行为。在旧代码中,背景(有时)会呈现为白色,尽管在调试时 getBackground() 会返回正确的颜色。 旧代码: @
有谁知道是否有办法(也许通过外部API)将图形绘图/转换为多个图形?这个想法是同时保存 PNG 和 PDF(使用 Java IText 库)。 最佳答案 您可以将 Graphics 对象写入(java
我试图了解如何在英特尔芯片组上以 x86 保护模式绘制简单图形。我已经(有点)知道如何使用 VGA 接口(interface)来做到这一点,并且我正在尝试了解如何使用 G35 Express 来做到这
在我的应用程序中,我生成了一个条形码图像,该图像是根据用户使用 OpenFileDialog 上传的文件中的数据生成的。我的目标是允许用户在屏幕上查看条形码数据和图像本身,打印并使他们能够将两者保存为
我是 Java 新手,我只是想得到一些简单的东西,可能类似于 Zelle's graphics对于Python。 最佳答案 Java 类 Graphics和 Graphics2D应该包含 Zelle
如何将 FMX.Graphics.TBitmap 转换为 VCL.Graphics.TBitmap 或 Vcl.Imaging.PngImage.TPngImage? 我的项目中有FMX表单和VCL表
我需要找到用于间距目的的字体大小,发现这很有帮助:https://docs.oracle.com/javase/tutorial/2d/text/measuringtext.html 但是,我不确定如
我有一点奇怪的错误是由一个看似简单的问题引起的。 在我的源代码中,我尝试使用 QQuickPaintedItem 来呈现 QWidget 派生类 (QPushButton) 的整体外观,然后将其绘制到
我正在尝试通过具有以下规范的设备来解决 Android 应用程序崩溃的问题: Device PAP3400DUO 1 Manufacturer — Android version Android 4.
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 9 年前。 Improve this ques
我有这行代码: mBgTransition = (TransitionDrawable) mSwitchBg.getBackground(); 背景曾经是一个常规的可绘制对象, 但现在是 9 个补丁
当我的应用程序在启动时崩溃时尝试实现自适应图标时出现此错误。 我无法想象为什么会收到此错误,因为在下面错误日志中提到的文件(MainActivity 和 BaseActivity)中,我没有使用Ada
我是一名优秀的程序员,十分优秀!