Directdraw:旋转video流

问题

Windows Mobile / Directdraw:旋转video流

video预览正在运行,我现在需要的只是一种旋转图像的方法。 我认为解决这个问题的唯一方法是编写一个基于CTransformFilter的自定义filter,它将为您旋转相机图像。 如果你可以帮助我解决这个问题,例如帮助我用我有限的DirectDraw知识开发这个filter,赏金就是你的。

背景/上一个问题

我目前正在开发移动设备应用程序(HTC HD2,Windows Mobile 6)。 程序需要做的一件事是使用内置相机拍照。 以前我使用Windows Mobile 6 SDK提供的CameraCaptureDialog做到这一点,但我们的客户想要一个更加用户友好的解决方案。

我们的想法是在控件中预览相机的video流,并在单击控件时使用相机的照片function拍摄高分辨率图片(> = 2百万像素)。 我们对该主题进行了一些研究,发现实现这一目标的最佳方法似乎是使用Direct Draw。

缺点是我从未真正使用任何原生Windows API,而且我的C ++相当糟糕。 除此之外,我在某处读到HTC手机的Direct Draw支持特别糟糕,您必须使用未记录的本机HTC库调用来拍摄高质量的图片。

好消息是,一家公司让我们开发出符合上述规格的控制器。 他们估计大约需要10天,如果我们能够在合理的时间内自行开发这种控制,就会引发讨论。

现在我的工作是研究哪种替代方案更好。 毋庸置疑,研究整个架构并开发演示的时间太少,这引出了以下问题:

问题不再相关!

  • 你们有没有相似项目的经验? 你有什么建议?
  • 是否有一个很好的Direct Draw源代码示例处理video预览和图像捕获?

好吧,如果你看看EZRGB24样本,你会得到一个简单的video变换滤波器的基础知识。

您需要对样本执行两项操作才能使其按照您的意愿执行操作。

1)您需要将x,y复制到y,x。
2)您需要告诉媒体示例样本现在是高度x宽度而不是宽度x高度。

请记住,最终图像的像素数将完全相同。

解决1比较简单。 您可以通过执行“x +(y * Width)”来计算像素的位置。 所以你逐步遍历每个x和y计算那个位置,然后把它写成“y +(x * Height)”。 这将转置图像。 当然没有step2,这看起来完全错了。

要解决2,您需要获取输入样本的AM_MEDIA_TYPE。 然后,您需要找出formatType是什么(可能是FormatType_VideoInfo或FormatType_VideoInfo2)。 因此,您可以将AM_MEDIA_TYPE的pbFormat成员强制转换为VIDEOINFOHEADER或VIDEOINFOHEADER2(取决于FormatType)。 您现在需要将VIDEOINFOHEADER [2] :: bmiHeader.biWidth和biHeight设置为输入媒体样本的biHeight和biWidth(分别)。 其他所有内容都应与输入AM_MEDIA_TYPE相同。

我希望有所帮助。

这个问题将帮助您获得有关DirectDraw的一些细节。 我前段时间对此做了一些研究,我能找到的最好的是这篇博文(在上面的问题中也提到过)。 该post提供了SDK中CameraCapture示例的扩展。

但是,没有很高的期望。 似乎预览和拍摄的照片只能以小分辨率工作。 尽管DirectDraw确实描述了一种配置分辨率的方法,但无法保证驱动程序能够正确实现这一点。

根据我的经验,你所读到的是真实的。 唯一的方法是使用HTC驱动程序。 因此,如果您不想在逆向工程中度过无尽的日子以获得可疑的结果,那就让其他人为您完成这项工作。 如果你想尝试一下,试试xda-developers论坛 。