2011-12-08 87 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以上的位圖。