DirectShow的和窗口不支持12 - 16位灰度位图。领导定义LGRY视频格式允许使用这些位图使用DirectShow的架构。这是用于DICOM过滤器生成灰度视频超过8位/像素。
当描述12/16-bit压缩数据,表明媒体类型格式是使用LGRYVideoInfo结构通过设置媒体FORMAT_LGRYVideoInfo亚型。在描述未压缩12/16-bit数据,表明媒体类型格式是使用LGRYVideoInfo结构通过设置biCompression LGRY。但即使在这种情况下,最好还设置媒体FORMAT_LGRYVideoInfo亚型。
下面的定义语句和结构可以在< INSTDIR > \ \ LGRYType.H包括:
静态GUID FORMAT_LGRYVideoInfo = {0 x48799704 0 x2735 0 x4be6, {0 xa0, 0 xce 0 xdd 0 . xc6, 0 x2c 0 25, 0 xa4 0 xf2}};
formattype成员的媒体类型必须设置为FORMAT_LGRYVideoInfo(或ltmmFORMAT_LGRYVideoInfo)显示使用LGRYVIDEOINFO结构来描述12或16位压缩数据。没有必要设置formattype表示未压缩12/16-bit数据,但建议这样做,即使是未压缩的数据。
请注意:在LGRYType FORMAT_LGRYVideoInfo定义。h,而ltmmFORMAT_LGRYVideoInfo ltmm.h中定义。
类型定义结构体
{
矩形rcSource;
矩形rcTarget;
DWORD dwBitRate;
DWORD dwBitErrorRate;
REFERENCE_TIME AvgTimePerFrame;
LGRYINFOHEADER bmiHeader;
RGBQUAD bmiColors [65536];
}LGRYVIDEOINFO,远* pLGRYVIDEOINFO;
描述灰度视频格式的格式:
成员 |
描述 |
rcSource |
要使用的图像部分 |
rcTarget |
目标位置的视频 |
dwBitRate |
近似位数据率 |
dwBitErrorRate |
这个流比特误码率 |
AvgTimePerFrame |
平均时间每帧(100 ns单位) |
bmiHeader |
包含灰度图像的结构信息。 |
bmiColors |
词根重新映射查找表(LUT)。这是可选的。这个领域被忽略,除非bmiHeader。biClrUsed是非零的。 |
类型定义结构体tagLGRYINFOHEADER
{
/ * * / BITMAPINFOHEADER字段
DWORD biSize;
长biWidth;
长biHeight;
单词双翼飞机;
单词biBitCount;
DWORD biCompression;
DWORD biSizeImage;
长biXPelsPerMeter;
长biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
/ *字段特定LGRY格式* /
长biLowBit;
长biHighBit;
长biMinVal;
长biMaxVal;
长biWindowWidth;
长biWindowCenter;
双biRescaleIntercept;
双biRescaleSlope;
DWORD biFlags;
长nReserved1;
长nReserved2;
长nReserved3;
}LGRYINFOHEADER,远* pLGRYINFOHEADER;
描述了灰度图像。
成员 |
描述 |
biSize |
这种结构的大小。应该sizeof (LGRYINFOHEADER)。 |
biWidth |
视频宽度。 |
biHeight |
使用积极的值指定一个自上而下的形象。这是对Windows约定的未压缩的RGB图像。 |
双翼飞机 |
应该是1 |
biBitCount |
应该是12或16: |
biCompression |
应该mmioFOURCC (‘L’、‘G’、‘R’,‘Y’)来表示未压缩的数据。 应该mmioFOURCC (“L”、“j”、“p”,“g”)来表示无损的JPEG数据。 应该mmioFOURCC (“J”、“P”、“E”,“G”)或mmioFOURCC(“米”、“J”,“P”,“G”)来表示有损JPEG数据。 当使用JPEG数据,设置formattype FORMAT_LGRYVideoInfo或ltmmFORMAT_LGRYVideoInfo。 |
biSizeImage |
图像文件的大小(以字节为单位)。每一行的大小需要4个字节的倍数,所以可能需要填充。的公式正确计算这个领域是:biSizeImage = ((((biWidth * biBitCount) + 31) & ~ 31) / 8) * abs (biHeight) |
biXPelsPerMeter |
指定的水平分辨率,像素每米。 |
biYPelsPerMeter |
指定的垂直分辨率,像素每米。 |
biClrUsed |
如果不存在的0。在这种情况下,bmiColors字段是不习惯/需要。 如果有一个附近地区! = 0。在这种情况下,bmiColors包含的。biClrUsed应该等于1 < < (biHighBit biLowBit + 1) |
biClrImportant |
目前还不能使用。将这个值设置为0 |
biLowBit |
低一点的像素数据(0 < = biLowBit < = biHighBit < = biBitCount-1)。 |
biHighBit |
高像素数据。 |
biMinVal |
最小值的像素数据(忽略了non-pixel比特)。 |
biMaxVal |
最大值的像素数据(忽略了non-pixel比特)。 |
biWindowWidth |
DICOM窗口宽度。这可以用于再生的。 |
biWindowCenter |
DICOM窗口中心。这可以用于再生的。 |
biRescaleIntercept |
DICOM重新调节拦截。这可以用于再生的。 |
biRescaleSlope |
DICOM重新调节斜率。这可以用于再生的。 |
biFlags |
显示哪些字段是有效的。可能的值是: LGRY_RESCALE_VALID [0 x0001]如果设置,biRescaleIntercept biRescaleSlope是有效的 LGRY_WINDOW_VALID [0 x0002]如果设置,biWindowSize biWindowCenter是有效的 LGRY_BITRANGE_VALID [0 x0004]如果设置,biLowBit biHighBit是有效的 LGRY_MINMAX_VALID [0 x0010]如果设置,biMinVal biMaxVal是有效的 LGRY_LUT_ISGENERATED [0 x0020]如果有附近地区:如果设置,从有效LGRY-specific字段生成的。如果没有设置,不能从其他LGRY再生的字段。在这种情况下,需要保存的文件中。 LGRY_LUT_ISGRAYSCALE [0 x0040]如果有附近地区和设置这个标志,然后只包含的灰度值。这个标志被设置为避免经历的每次检测是否只包含灰度的颜色。 LGRY_LUT_ISCOLOR [0 x0080]如果有附近地区和设置这个标志,然后包含non-grayscale值的。这个标志被设置为避免经历的每次检测是否只包含灰度的颜色。 LGRY_LUT_COLORMASK [0 x00c0]这不是国旗。它是一个面具,可以用来探测附近地区是否颜色,灰度或未知。 |
nReserved1 |
保留以供将来使用。 |
nReserved2 |
保留以供将来使用。 |
nReserved3 |
保留以供将来使用。 |
12位数据包装:每2像素占3个字节。
例如,如果您有(2)12位值和十六进制值0 xabc和0 xdef,他们将被存储在内存中是这样的:0 xbc 0 xfa 0 xde
这个包装的优点是你可以得到每个值在英特尔处理器一个阅读和逻辑操作(与0 xfff”和“第一个值,右移4位第二值)。
下面的宏可以用来处理包装12位数据(请记住,这些是C多行宏和重要的是,他们有“\”结束时线):
/ /辅助宏观递增一个指针
#定义PTR_INC (p)(((字节*)p) + 1)
/ /读取第一个12位值
#定义GET12_0 (p)((*(字*)p) & 0 xfff)
/ /读第二个12位值
#定义GET12_1 (p)((*(字*)PTR_INC (p)) > > 4)
/ /写两个12位值
#定义PUT12 (p val0 val1) *(字*)p = (((val0) & 0 xfff) |
(词)(val1) < < 12));\
((字节*)p)[2] =((字)(val1) > > 4)
/ /写第一个12位值
#定义PUT12_0 (p, val0) *(字*)p =((*(字*)(p) & 0 xf000) | \
((val0) & 0 xfff))
/ /写第二个12位值
#定义PUT12_1 (p, val1) *(字*)PTR_INC (p) = \
((*(字*)PTR_INC (p) & 0 xf) | \
((词)(val1) < < 4))
下面的例子描述了如何设置各种字段描述灰度16位数据只使用低10位:
LGRYVIDEOINFO信息;/ *警告:做不把这在堆栈,因为它非常大* /
info.bmiHeader。biSize =运算符(LGRYINFOHEADER);
info.bmiHeader。biWidth= VideoWidth;
info.bmiHeader。biHeight= VideoHeight; /* should be positive为正常(unflipped视频)* /
info.bmiHeader。双翼飞机= 1;
info.bmiHeader。biBitCount= 16; /* I have 16 bits per pixel, although only the lower 10 bits contain useful data */
info.bmiHeader。biCompression= mmioFOURCC('L', 'G', 'R', 'Y');
info.bmiHeader。biSizeImage= (((VideoWidth * 2) + 3) & ~3) * VideoHeight;
info.bmiHeader。biClrUsed = 0;/ *没有附近地区* /
info.bmiHeader。biClrImportant= 0; /* not used right now. Set这价值0 * /
/ *字段特定LGRY格式* /
info.bmiHeader。biLowBit = 0;/ *低一点为像素数据(0 < = biLowBit < = biHighBit < = biBitCount-1) * /
info.bmiHeader。biHighBit = 9;/ * 10 - 1 = 9。高一些为像素数据。* /
info.bmiHeader。biFlags= LGRY_BITRANGE_VALID; /* only biLowBit and biHighBit are valid */
/ *自这情况下不使用的,只有足够的设置的字段LGRYVIDEOINFO包括bmiHeader。的有用的大小
LGRYVIDEOINFO结构offsetof (LGRYVIDEOINFO bmiColors)。* /