【发布时间】:2013-12-27 20:45:47
【问题描述】:
这是我删除图像红色通道的代码。 有什么办法可以在 GPU 上实现吗?
其实我想要的是, 我有一个源位图数据(指针)和一个目标位图数据(指针)。 我想对 SOURCE BITMAP 进行一些计算,并将结果放到 DESTINATION BITMAP 中。
这段代码工作得很好,但我正在处理大图像。这就是为什么我希望 GPU 进行计算但我不想使用 CUDA 或 ATI 的 SDK。因为如果我使用 CUDA 或 ATI 的 SDK,我将需要这个图形卡。这就是为什么我需要适用于所有图形卡的东西。我尝试使用 DirectX,但没有看到类似的计算...
有没有库可以让 GPU 做到这一点?
private unsafe void testX()
{
Bitmap sourceBmp = (Bitmap)System.Drawing.Bitmap.FromFile(@"C:\cc.jpg");
BitmapData sourceBmd = sourceBmp.LockBits(new System.Drawing.Rectangle(0, 0, sourceBmp.Width, sourceBmp.Height), ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format32bppRgb);
IntPtr sourcePtr = sourceBmd.Scan0;
uint* pSource = (uint*)sourcePtr.ToPointer();
Bitmap destinationBmp = new Bitmap(sourceBmp.Width, sourceBmp.Height, System.Drawing.Imaging.PixelFormat.Format32bppRgb);
BitmapData destinationBmd = destinationBmp.LockBits(new System.Drawing.Rectangle(0, 0, sourceBmp.Width, sourceBmp.Height), ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format32bppRgb);
IntPtr destinationPtr = destinationBmd.Scan0;
uint* pDest = (uint*)destinationPtr.ToPointer();
int _w = sourceBmp.Width;
int _h = sourceBmp.Height;
for (int j = 0; j < _h; j++)
{
for (int i = 0; i < _w; i++)
{
*pDest = (*pSource) & 0xff00ffff;
pDest++;
pSource++;
}
}
sourceBmp.UnlockBits(sourceBmd);
destinationBmp.UnlockBits(destinationBmd);
if (File.Exists(@"C:\deneme2.jpg"))
File.Delete(@"C:\deneme2.jpg");
destinationBmp.Save(@"C:\deneme2.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
MessageBox.Show("Done!");
}
private void Button_Click_1(object sender, RoutedEventArgs e)
{
testX();
}
最后,我尝试了太多东西,例如 CUDA、OpenGL、OpenCL 和 ATI 的 SDK,我需要下载至少 300MB 的文件才能使用这些 SDK。所以,我需要的是一个适用于所有显卡的小型库或头文件。感谢您的帮助和回答。
顺便说一句,对不起我的英语。
谢谢。
【问题讨论】:
-
如果您不想使用 CUDA,为什么要将它发布到 CUDA 标签? GPGPU 标签会更合适。您可以考虑使用 OpenCL,它可以帮助您在 CUDA 和非 CUDA 卡上运行代码(一旦编写)。我投票关闭这个非问题的帖子。下次尝试使用与您在下面写的帖子相关的标题。 StackOverflow 是一个社区。发布问题,您将获得他人的帮助。如果与您的问题相似,适当的标题可能会帮助其他用户找到解决他们自己问题的方法。
-
如果你要求一个库来做它会产生一个悖论,但不想要“CUDA或其他东西”,因为“库”是集合的一个元素“别的东西”。