2011-12-08 46 views
2

我是一名Flash程序员,目前正在探索C++。在Flash中,您可以创建一个位图并将其放置在屏幕上,然后使用getPixel(x,y),setPixel(x,y,c)等方法。按Ctrl + Enter,你可以开始做你想做的事情。简单的位图图形在C + +?

我使用Visual C++ 2010.因为我已经使用Flash很多,我习惯于简单和短命令。但是,在C++中,很难弄清楚如何获得可以操纵像素的位图。

我对图形工具或3D引擎了解不多,但它是非常有用的信息,但首先我想看看我可以用像素创建什么,所以你知道一个简单的方法来创建一个可操作的C++中的位图?尽可能优化,然后我可以编写我自己的drawLine,drawCurve等功能。 :)

+5

“Plain C++”不包含任何内容与图形一起工作。你必须选择一些图形库/工具包。 –

+1

您可以直接将位图文件格式解析为您自己的像素数组:http://en.wikipedia.org/wiki/BMP_file_format或者您可以使用类似OpenCV的库(http://opencv.willowgarage.com/wiki/) – TJD

+2

不幸的是,即使在Windows世界中,这也变得很复杂。有许多第三方图形库,以及与各种类型的位图一起工作的Windows API。但是,您可能想浏览像CodeProject.com这样的网站,以查看使用Windows GDI操纵位图的各种程序/函数的示例。或者看一下GDI + API(更好用一点)。 – Mordachai

回答

0

那么这是即将到来的答案可能是一个你不会喜欢,但我反正给它:)

C++没有图形输出的概念都没有。幸运的是,我们已经获得了将文本打印到屏幕的标准方式 - 但就是这样。真。这里不开玩笑。但是,大多数操作系统提供了一种图形输出方式(主要是通过C接口,因为C几乎是二进制兼容的),并且还有C++包装库,可以访问这些库。然而,处理操作系统问题与C++相比是一个非常不同的野兽(我可以说这是一个有点野兽)。幸运的是,如果你不想/完全理解完整的故事,我可以推荐Qt(http://qt.nokia.com/products/)作为GUI编程的一个非常体面的库。一旦你有一个GUI窗口,你也可以在该GUI中绘制位图(我相信Qt具有直接的位图支持,并且可以加载图像)。 但是,我将不得不向你推荐Qt的教程文档,因为即使是一个简单的介绍也会介绍一下仍然可以理解的论坛答案。

这恐怕会很容易,因为它可以使用C++在屏幕上绘图。对于这个目的而言,没有什么比Flash更简单,但最终的方式更加强大。

祝你好运。

1

因为您提到了Visual C++ 2010,我将假定您使用的是Vista或更高版本,并且您想先使用本机Windows C++方法绘制2D图形。如果是这种情况,你想使用Direct2D。你可能会发现使用GDI的旧文章,但这是旧的方式,所以不要使用它。这里是向MSDN介绍Direct2D的link

+0

GDI可能比较旧,但将其用于简单图形/ UI操作没有任何问题。如果你正在做的是绘制一个位图,Direct2D是一个相当矫枉过正的解决方案。 [它们也不是互不相关的API](http://msdn.microsoft.com/zh-cn/library/windows/desktop/dd370990.aspx)。 –

+0

@ln silico:对,你是对的,GDI不会很快消失,因为许多程序(传统应用程序)都依赖它。但是,由于GDI/GDI +在MSDN上的“传统图形”下列出,因此我认为Microsoft不建议使用它。 –

+0

我想如果微软真的不希望人们使用它,他们会将其标记为“已弃用”而不是“遗留”,IMO。 –

0

您需要外部库来从文件读取图像。我喜欢的两个库是SDL_imagestb_image。两者都以可让您访问和操作像素的格式显示图像。

此外,要显示图像,您将需要外部库。 SDL是流行和简单的。

1

如果你真的想使用C++,你应该看看使用GDI +,这是标准的Windows/VS图形方式。这是一个稍微高一点的(友好的)api比旧的GDI api做图形可以追溯到(预)MFC天。您需要掌握设备上下文等基本知识,以了解如何从文件加载位图并将其显示在屏幕上。
CGI +允许使用LockBits方法以像素为单位轻松操作位图。它可以读取最常见的图像格式(BMP,JPG,PNG等)。
以下示例代码示出了一个典型的负载位图和读取一些像素类型码(它被逐字取自this msdn gdi+ article

#include <windows.h> 
#include <gdiplus.h> 
#include <stdio.h> 
using namespace Gdiplus; 

INT main() { 
    GdiplusStartupInput gdiplusStartupInput; 
    ULONG_PTR gdiplusToken; 
    GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); 

    Bitmap* bitmap = new Bitmap(L"LockBitsTest1.bmp"); 
    BitmapData* bitmapData = new BitmapData; 
    Rect rect(20, 30, 5, 3); 

    // Lock a 5x3 rectangular portion of the bitmap for reading. 
    bitmap->LockBits(
     &rect, 
     ImageLockModeRead, 
     PixelFormat32bppARGB, 
     bitmapData); 

    printf("The stride is %d.\n\n", bitmapData->Stride); 

    // Display the hexadecimal value of each pixel in the 5x3 rectangle. 
    UINT* pixels = (UINT*)bitmapData->Scan0; 

    for(UINT row = 0; row < 3; ++row) { 
     for(UINT col = 0; col < 5; ++col) 
     printf("%x\n", pixels[row * bitmapData->Stride/4 + col]); 
     printf("- - - - - - - - - - \n"); 
    } 

    bitmap->UnlockBits(bitmapData); 

    delete bitmapData; 
    delete bitmap; 
    GdiplusShutdown(gdiplusToken); 
    return 0; 
} 

至于拉线,绘制曲线等例程 - 这些都发现在图形对象中GDI +,它的主要对象,你的代码和屏幕之间坐镇。图形对象将被用来渲染使用Graphics.DrawImage以上的位图。