- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要做一个简单的检查 dds 文件的格式是否有效。我只需要对 dds 文件进行一般检查,所以我不需要检查它是否是 dxt1、dxt5、dx10 等。例如,如果我有一个 png 图像并且我将扩展名重命名为 .dds dds 格式当然会是错误的,然后我需要告诉用户他正在尝试使用格式错误的 dds 文件。但是,如果我有一个确实具有正确文件格式的 dds,我将不需要做任何进一步的调查,因为我不关心它是什么类型的 dds 文件(此时)。所以我只需要阅读 dds 文件中所有 dds 文件都保持不变的部分。我想我可以通过某种方式读取 dds header 和魔数(Magic Number)。我必须对 png 文件进行相同的验证,并且我正在读取 png 标题,如下所示:
var png = new byte[] { 0x89, 0x50, 0x4e, 0x47, 0x0D, 0x0A, 0x1A, 0x0A }
using (FileStream fs = new FileStream(fileToCheck, FileMode.Open, FileAccess.Read))
{
if (fs.Length > buffer.Length)
{
fs.Read(buffer, 0, buffer.Length);
fs.Position = (int)fs.Length - endBuffer.Length;
fs.Read(bufferEnd, 0, endBuffer.Length);
}
fs.Close();
}
for (int i = 0; i < png.Length; i++)
{
if (buffer[i] != png[i])
return false;
}
return true;
我正在寻找是否有类似的方法来检查 dds 文件的格式。我对此很陌生,我遇到的问题是知道 dds 文件中的哪些字节对于所有 dds 文件始终相同(以便我可以检查这些字节以查看 dds 格式是否有效)以及我如何可以通过简单的方式实现代码来检查dds格式。任何帮助将不胜感激。
编辑:所以感谢@NaCl,我已经回答了问题的第一部分。我现在知道 dds 文件中的哪些部分是必需的,但我不知道如何在 dds 文件中找到它。我用十六进制编辑器打开了很多 dds 文件,但我不太擅长逆向工程,所以我不明白我需要检查的字节在哪里,这进一步让我不知道如何实现代码在指定的位置搜索字节(我可以用 png 文件来做,因为我发现了更多关于该文件的文档),因为我不知道去哪个位置。
如果有人能指出正确的方向或以其他方式帮助我,我将不胜感激。谢谢。
最佳答案
对于具有 header 的文件要做的第一件事是检查其魔数(Magic Number)(如果文档中给出了任何魔数(Magic Number)),以防DDS file。 ,魔数(Magic Number)是0x44445220
,等于“纯文本”中的“DDS”
。
之后,只需处理规范即可。所有内容(魔数(Magic Number)除外)都以小端格式存储,因此在处理字节时要小心,据微软称,definition DDS header 的结构是 (C++):
typedef struct {
DWORD dwSize; /* Always equal to 124 */
DWORD dwFlags;
DWORD dwHeight;
DWORD dwWidth;
DWORD dwPitchOrLinearSize;
DWORD dwDepth;
DWORD dwMipMapCount;
DWORD dwReserved1[11];
DDS_PIXELFORMAT ddspf;
DWORD dwCaps;
DWORD dwCaps2;
DWORD dwCaps3;
DWORD dwCaps4;
DWORD dwReserved2;
} DDS_HEADER;
基于此,我为任何“通用”DDS 文件提供了以下代码:
public static bool IsValidDDS(string path)
{
if (path == null)
throw new ArgumentNullException(nameof(path));
if (!File.Exists(path)) // Check for existence.
return false;
uint magicNumber = 0; byte[] headerLength = new byte[sizeof(byte)];
using (var fs = new FileStream(path, FileMode.Open, FileAccess.Read))
{
byte[] magic = new byte[sizeof(uint)];
// I'm still pretty used to C and fread, so here you go :^)
if (fs.Read(magic, 0, sizeof(uint)) != sizeof(uint))
return false; // Not even a valid file.
if (fs.Read(headerLength, 0, sizeof(byte)) != sizeof(byte))
return false; // Not enough bytes, even if the first 4 bytes were checked.
// Convert to a big endian integer.
magicNumber = (uint)((magic[0] << 24) | (magic[1] << 16) | (magic[2] << 8) | magic[3]);
}
return (headerLength[0] == 0x7C) && (magicNumber == 0x44445320);
}
上面的代码只检查输入文件的前 5 个字节(作为参数 path
传递),它们总是和我看到的一样,应该等于:
0x44 0x44 0x53 0x20 0x7C 0x00 0x00 0x00 (8 bytes)
上面的代码是用这个存储库中的 .dds
文件测试的:https://github.com/toji/webgl-texture-utils/tree/master/sample/img ,并且这两个文件具有完全相同的 header :
iamnacl:~/workspace $ cd dds-test/
iamnacl:~/workspace/dds-test $ dotnet run ../test-dxt1.dds
The file is a valid DDS file? True
iamnacl:~/workspace/dds-test $ dotnet run ../test-dxt5.dds
The file is a valid DDS file? True
iamnacl:~/workspace/dds-test $
您可以优化上面的代码以执行对 ulong
大小的 fs.Read
的单个调用,并根据此值检查整个事情:0x444453207C000000
。
希望这有帮助:)
关于c# - 如何确保 DirectDraw 表面具有正确的文件格式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51974508/
我有以 xyz 点格式表示 3D 表面(即地震断层平面)的数据。我想创建这些表面的 3D 表示。我使用 rgl 和 akima 取得了一些成功,但是它无法真正处理可能会自行折叠或在同一 x,y 点具有
我正在尝试将此 X、Y、Z 数据集拟合到未知表面。 不幸的是,线性拟合不足以显示表面数据。我认为多项式拟合可能适合这种情况。另外,问题是我不知道如何建立多项式拟合函数来完成曲面拟合。 任何帮助都会很棒
我已经用plotly构建了一个表面图表,并且我正在尝试根据我自己的文本获得hoverinfo。奇怪的是它不再工作了。 library(plotly) x % layout(dragmode = "tu
我有以下数据: library(rgl) x y,y->z,z->x) zmat <- matrix(data = z, nrow = 6, ncol = 5, byrow = FALSE) surf
我正在使用 DXVA 视频解码器。它工作正常,但我想与另一个 IDirect3D9 设备对象共享解压缩的表面。 我读了this文件,我调用 IDirectXVideoDecoderService::C
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
import pygame, sys, os.path pygame.init() # set up the colours # R G B BLACK = ( 0,
我的目标是在 pygame 实例内显示一个颜色图,以 49 个元素 ndarray 的形式反射(reflect)实时输入,范围从 -6 到 2,标准化为 0 到 1 的值。到目前为止,我正在使用 ma
我在 Visual C# -> surface -> v2.0 -> MS visual C# 2010 express 中的 Surface Application (WPF) 模板中工作。 我正在
我正在尝试在 JavaFX 中实现我自己的 3D 表面动画,但我不理解它应该工作的一切,有人可以帮助我理解哪个应该放在哪里吗? 已经知道使用类构建Mesh需要类对象TraingleMesh然后必须使用
根据我的阅读,我不相信 SurfaceView 可以设置动画,但我会问这个问题: 我在 ViewFlipper 中有一个 surfaceView 对象。当 ViewFlipper 向左或向右移动到新的
我想在 android 屏幕上有一个图像,图像的不同部分可以点击。我的意思是,如果它是 3 个圆圈的图像,我希望能够单击这些圆圈中的每一个, 然后我可以为每个可点击的圆圈添加不同的功能。对于下图中的示
我有一个通过kinect获得的点集,现在我想创建一个网格。我正在尝试使用 CGAL 库并且正在关注 this example . 我使用的是 VS2010,它运行没有任何错误,但是当然它没有在行中
在让我的 SurfaceView 显示我的相机预览时遇到一点问题。我在这里查看了一些问题并通过 Google 搜索了一些 tuts,但我认为这可能是我这边的一个小错误,我只是没有看到。 代码 publ
任何人都可以为我指出一些类(class)或对以下情况提出任何建议吗? 我有一个 SurfaceView,它有一个背景图像,我希望在其上绘制其他位图。我想支持以下操作: 点击一下,新的位图就会添加到背景
我正在尝试学习表面 View 并且我确实读到了它。 所以,我试着制作了一个游戏,我认为它可以帮助我更好地学习。 我创建了一个表面 View 类,如下所示: class SnakeEngine exte
我希望笑脸 div(在用户进入墙壁后显示)将覆盖主迷宫表面而不改变笑脸大小:你能帮帮我吗? 这是 fiddle 链接: http://jsfiddle.net/uqcLn/66/ 这是笑脸 div:
我有一组 (x,y,z) 点,这些点具有相应的法线和值。所以数据的形式是 [x y z nx ny nz c]。我想在这些垂直于这些法线的点上绘制一个 3D 表面,并且具有与该值对应的颜色。所以我想要
我有一个不是函数图的表面的 3D 数据集。数据只是 3D 中的一堆点,我唯一能想到的就是在 Matlab 中尝试 scatter3。 Surf 将不起作用,因为表面不是函数图。 使用 scatter3
假设我有一个函数,例如: 现在,我想绘制它的曲面图(matplotlib plot_surface )。我使用 np.arange(stop,end,increment) 构造了三个数组。 在这里,我
我是一名优秀的程序员,十分优秀!