问题
Windows Mobile / Directdraw: Rotate video stream
视频预览正常工作,我现在需要的只是一种旋转图像的方法。我认为解决这个问题的唯一方法是编写一个基于CTransformFilter
的自定义过滤器,它会为您旋转相机图像。如果你能帮我解决这个问题,例如通过帮助我利用我有限的DirectDraw知识开发这个过滤器,赏金就是你的。
背景/上一个问题
我目前正在开发移动设备应用程序(HTC HD2,Windows Mobile 6)。程序需要做的一件事是使用内置相机拍照。以前我使用Windows Mobile 6 SDK提供的CameraCaptureDialog
做到了这一点,但我们的客户想要一个更加用户友好的解决方案。
想法是在控件中预览相机的视频流,并在单击控件时使用相机的照片功能拍摄高分辨率图片(> = 2百万像素)。我们对该主题进行了一些研究,发现实现这一目标的最佳方法似乎是使用Direct Draw。
缺点是我从未真正使用任何原生Windows API,而且我的C ++相当糟糕。除此之外,我在某处读到HTC手机的Direct Draw支持是特殊的,你将不得不使用未记录的原生HTC库调用来拍摄高质量的图片。
好消息是,一家公司向我们提供了开发符合上述规格的控制器。他们估计大约需要10天,如果我们能够在合理的时间内完成这项控制,就会引发讨论。
现在我的工作是研究哪种替代方案更好。毋庸置疑,研究整个architecture并开发演示的时间太少,这引出了以下问题:
问题不再相关!
答案 0 :(得分:2)
如果您查看EZRGB24示例,您将获得简单视频转换滤镜的基础知识。
您需要对样本做两件事才能让它做你想做的事。
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相同。
我希望有所帮助。
答案 1 :(得分:1)
这个question将帮助您获得有关DirectDraw的一些详细信息。我前段时间对此做了一些研究,我能找到的最好的是这个博客post(在上面的问题中也提到过)。该帖子提供了SDK中CameraCapture示例的扩展。
但是,没有很高的期望。似乎预览和拍摄的照片只能以小分辨率工作。尽管DirectDraw以describe的方式配置分辨率,但无法保证驱动程序能够正确实现此功能。
根据我的经验,你所读的是真的。唯一的方法是使用HTC驱动程序。因此,如果您不想在逆向工程中度过无尽的日子以获得可疑的结果,那就让其他人为您完成这项工作。如果你想试一试,试试xda-developers forum。