我要旋转大于4096x4096的图像。 (即4096x8192)。
图像从文件加载到使用以下方法调用创建的IDirect3DSurface9:
CreateOffscreenPlainSurface(width, height, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &surface.s, NULL);
在StretchRect函数的帮助下完成简单的图像处理(平移和缩放)。但是,当要在表面上旋转图像时,我必须锁定源图像和目标图像的部分。然后我必须在CPU中旋转太慢的图像。这是一个简单的表面旋转90度的示例代码。
SurfaceScopedLock srcImageLock(*srcImage.s, &result);
SurfaceScopedLock dstImageLock(*dstImage.s, &result);
D3DLOCKED_RECT& lrSrc = srcImageLock.getLockedRect();
D3DLOCKED_RECT& lrDst = dstImageLock.getLockedRect();
//Format is D3DFMT_A8R8G8B8 = 4 bytes per pixel so we cast it to unsigned int
unsigned int* sourceImgData = ((unsigned int*)lrSrc.pBits);
unsigned int* destImgData = ((unsigned int*)lrDst.pBits);
int srcStep = lrSrc.Pitch / sizeof(unsigned int);
int dstStep = lrDst.Pitch / sizeof(unsigned int);
for (int i = 0; i < srcImage.height; i++)
{
for (int j = 0; j < srcImage.width; j++)
{
int srcIndex = i * srcStep + j;
int dstIndex = j * dstStep + i;
destImgData[dstIndex] = sourceImgData[srcIndex];
}
}
有没有办法通过任何方法加速这个过程?即将表面分成多个纹理,每个纹理旋转它们并将它们合并回来。如果是这样,有人可以提供代码示例吗?
注意: