在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

什么是SDL在屏幕上顯示一張圖片

汽車電子技術(shù) ? 來源:C語言Plus ? 作者:Maye426 ? 2023-02-27 14:44 ? 次閱讀

既然你已經(jīng)配置好了SDL, 是時候來建立一個能加載并顯示一張圖片的基本圖形程序了。

//啟動SDL并創(chuàng)建窗口
bool initSDL();


//加載媒體
bool loadMedia();


//釋放媒體并關(guān)閉SDL
void closeSDL();

在第一個教程中,我們將所有內(nèi)容都放在 main 函數(shù)中。由于它是一個小程序,我們可以這樣,但在實(shí)際程序中,代碼盡可能模塊化。這意味著你的代碼是整齊的塊,每個塊都易于調(diào)試和重用。

這意味著我們有處理初始化、加載媒體和關(guān)閉 SDL 應(yīng)用程序的函數(shù)。我們在源文件的頂部附近聲明這些函數(shù)。

//要渲染的窗口指針
SDL_Window* gWindow = NULL;

//窗口包含的表面
SDL_Surface* gScreenSurface = NULL;


//我們將載入并顯示在屏幕上的圖像
SDL_Surface* gHelloWorld = NULL;

這里我們聲明了一些全局變量。通常,你應(yīng)該避免在大型程序中使用全局變量。我們在這里這樣做的原因是因?yàn)槲覀兿M创a盡可能簡單,但是在大型項(xiàng)目中全局變量會使事情變得更加復(fù)雜。由于這是一個單一的源文件程序,我們不必太擔(dān)心。

這是一種稱為 SDL 表面的新數(shù)據(jù)類型。SDL 表面只是一種圖像數(shù)據(jù)類型,它包含圖像的像素以及渲染它所需的所有數(shù)據(jù)。SDL 表面使用軟件渲染,這意味著它使用 CPU 進(jìn)行渲染。可以渲染硬件圖像,但它有點(diǎn)困難,所以我們將首先通過簡單的方法學(xué)習(xí)它。在以后的教程中,我們將介紹如何渲染 GPU 加速圖像。

我們將在這里處理的圖像是屏幕圖像(您在窗口內(nèi)看到的)和我們將從文件加載的圖像。

請注意,這些是指向 SDL 表面的指針。原因是 :

  1. 我們將動態(tài)分配內(nèi)存來加載圖像
  2. 最好按內(nèi)存位置引用圖像。想象一下,你有一個磚墻游戲,由多次渲染的相同磚塊圖像組成(如超級馬里奧兄弟)。當(dāng)您可以擁有圖像的一個副本并一遍又一遍地渲染它時,在內(nèi)存中擁有數(shù)十個圖像副本是很浪費(fèi)的。

另外,請始終記住初始化您的指針。我們在聲明它們時立即將它們設(shè)置為 NULL。

bool initSDL()
{
    //初始化SDL
    if (SDL_Init(SDL_INIT_VIDEO) < 0)
    {
        SDL_Log("SDL could not initialize! SDL_Error: %s\\n", SDL_GetError());
        return false;
    }
    else
    {
        //創(chuàng)建窗口
        gWindow = SDL_CreateWindow("SDL Tutorial", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN);
        if (gWindow == NULL)
        {
            SDL_Log("Window could not be created! SDL_Error: %s\\n", SDL_GetError());
            return false;
        }
        else
        {
            //獲取窗口表面
            gScreenSurface = SDL_GetWindowSurface(gWindow);
        }
    }


    return true;
}

在上面的代碼中,我們已經(jīng)獲取了SDL初始化和窗口創(chuàng)建代碼,并將其放在自己的函數(shù)中。

我們想在窗口內(nèi)顯示圖像,為了做到這一點(diǎn),我們需要獲得窗口內(nèi)的圖像。因此,我們調(diào)用SDL_GetWindowSurface來獲取窗口所包含的表面。

bool loadMedia()
{
    //加載圖片
    gHelloWorld = SDL_LoadBMP("assets/02/hello_world.bmp");
    if (gHelloWorld == NULL)
    {
        SDL_Log("Unable to load image %s! SDL Error: %s\\n", "assets/02/hello_world.bmp", SDL_GetError());
        return false;
    }


    return true;
}

在加載媒體功能中,我們使用 SDL_LoadBMP 加載我們的圖像。SDL_LoadBMP 接受 bmp 文件的路徑并返回加載的表面。如果該函數(shù)返回 NULL,則意味著它失敗,因此我們使用 SDL_GetError 將錯誤打印到控制臺。

需要注意的重要一點(diǎn)是,這段代碼假設(shè)您的工作目錄中有一個名為“assets/02”的目錄,其中包含一個名為“hello_world.bmp”的圖像。工作目錄是您的應(yīng)用程序認(rèn)為它正在運(yùn)行的地方。通常,您的工作目錄是可執(zhí)行文件所在的目錄,但某些程序(如 Visual Studio)會將工作目錄更改為 vcxproj 文件所在的位置。因此,如果您的應(yīng)用程序找不到該圖像,請確保它位于正確的位置。

同樣,如果程序正在運(yùn)行但無法加載圖像,則您可能有工作目錄問題。工作目錄的功能因操作系統(tǒng)和 IDE 不同而異。

void closeSDL()
{
    //釋放表面內(nèi)存
    SDL_FreeSurface(gHelloWorld);
    gHelloWorld = NULL;


    //銷毀窗口
    SDL_DestroyWindow(gWindow);
    gWindow = NULL;


    //退出SDL子系統(tǒng)
    SDL_Quit();
}

在我們的清理代碼中,我們像以前一樣銷毀窗口并退出SDL,但我們還必須注意我們裝載的表面。我們通過使用sdl_freessurface來釋放它。不要擔(dān)心屏幕表面,SDL_DestroyWindow會處理它。

當(dāng)指針沒有指向任何東西時,請確保養(yǎng)成讓指針指向NULL的習(xí)慣。

int main( int argc, char* args[] )
{
    //啟動SDL并創(chuàng)建窗口
    if( !initSDL() )
    {
        SDL_Log( "Failed to initialize!\\n" );
    }
    else
    {
        //加載媒體
        if( !loadMedia() )
        {
            SDL_Log( "Failed to load media!\\n" );
        }
        else
        {
            //在窗口上顯示圖片
            SDL_BlitSurface( gHelloWorld, NULL, gScreenSurface, NULL );

在我們的主函數(shù)中,我們初始化 SDL 并加載圖像。如果成功,我們使用 SDL_BlitSurface 將加載的表面 blit 到屏幕表面上。

塊傳輸?shù)淖饔檬谦@取源表面并將其副本標(biāo)記到目標(biāo)表面上。SDL_BlitSurface 的第一個參數(shù)是源圖像。第三個參數(shù)是目的地。我們將在以后的教程中學(xué)習(xí)第二個和第四個參數(shù)。

現(xiàn)在,如果這是我們唯一的繪圖代碼,我們?nèi)匀徊粫谄聊簧峡吹轿覀兗虞d的圖像。還差一步。

//更新窗口表面
            SDL_UpdateWindowSurface( gWindow );

在屏幕上繪制了我們想要為該幀顯示的所有內(nèi)容后,我們必須使用 SDL_UpdateWindowSurface 更新屏幕。當(dāng)你在屏幕上繪圖時,你通常不會在屏幕上看到你看到的圖像。默認(rèn)情況下,大多數(shù)渲染系統(tǒng)都是雙緩沖的。這兩個緩沖區(qū)是前緩沖區(qū)和后緩沖區(qū)。

當(dāng)你進(jìn)行像 SDL_BlitSurface 這樣的繪制調(diào)用時,你渲染到后臺緩沖區(qū)。您在屏幕上看到的是前端緩沖區(qū)。我們這樣做的原因是因?yàn)榇蠖鄶?shù)框架需要在屏幕上繪制多個對象。如果我們只有一個前端緩沖區(qū),我們將能夠看到正在繪制的幀,這意味著我們會看到未完成的幀。所以我們要做的是首先將所有內(nèi)容繪制到后臺緩沖區(qū),完成后我們交換后臺緩沖區(qū)和前臺緩沖區(qū),這樣現(xiàn)在用戶就可以看到完成的幀了。

這也意味著您不會在每個 blit 之后調(diào)用 SDL_UpdateWindowSurface,只有在當(dāng)前幀的所有 blit 都完成之后才會調(diào)用。

//等待2秒
            SDL_Delay( 2000 );
        }
    }


    //釋放資源和關(guān)閉SDL
    closeSDL();


    return 0;
}

現(xiàn)在我們已經(jīng)把所有東西都渲染到了窗口上,我們延遲了兩秒鐘,這樣窗口就不會消失了。等待完成后,我們關(guān)閉我們的程序。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 程序
    +關(guān)注

    關(guān)注

    117

    文章

    3788

    瀏覽量

    81109
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4333

    瀏覽量

    62705
  • main
    +關(guān)注

    關(guān)注

    0

    文章

    38

    瀏覽量

    6170
收藏 人收藏

    評論

    相關(guān)推薦

    求助!!!Labiew一張張播放圖片

    怎么用for循環(huán),控制一張張播放圖片
    發(fā)表于 03-06 19:55

    一張圖片

    `就一張圖片`
    發(fā)表于 12-28 22:37

    怎么把做好的LabVIEW用一張圖片展示出來

    怎么把做好的LabVIEW用一張圖片展示出來,我做的LabVIEW有點(diǎn)偏大,屏幕展示不開
    發(fā)表于 11-25 12:37

    用NI vision怎么從一張圖片找出圖片上有多少不規(guī)則亮點(diǎn)!

    現(xiàn)在有一張圖片,請問用NI vision Assistant怎么找出圖片的不規(guī)則的亮點(diǎn)數(shù)量。(亮點(diǎn)和周邊有比較明顯的對比,可以區(qū)分)。
    發(fā)表于 04-02 11:41

    Labview拼圖怎么換一張圖片???

    程序附件,怎么換一張圖片用作拼圖,求指點(diǎn),謝謝!!!!
    發(fā)表于 04-07 00:22

    labview中怎么把一張圖片在二維圖片控件中顯示出來,求助!

    labview中怎么把一張圖片在二維圖片控件中顯示出來,求助!
    發(fā)表于 11-06 10:04

    移植SDL到JZ2440顯示BMP圖片

    :/********************************************************文件名稱: show_bmp_file.c******程序功能: 顯示一張bmp圖片
    發(fā)表于 06-29 11:19

    image_processing處理第二圖片,結(jié)果頁面總是顯示一張圖片,求!

    ,處理第一張圖片時運(yùn)行切正常,當(dāng)我return to main page,換一張圖片處理時,結(jié)果頁面里的表格中的信息確實(shí)是第二
    發(fā)表于 06-21 02:37

    請問DM8168HDVPSS如何實(shí)現(xiàn)一張一張圖片抓拍?

    本帖最后由 只耳朵怪 于 2018-6-22 10:38 編輯 DM8168HDVPSS如何實(shí)現(xiàn)一張一張圖片抓拍
    發(fā)表于 06-22 04:36

    請問ATM12864怎么設(shè)置一張圖片反白顯示

    初學(xué)ATM12864,現(xiàn)遇到個問題怎么設(shè)置一張圖片反白顯示,如圖,當(dāng)然圖片取模模式改個就可以
    發(fā)表于 11-13 08:51

    請問如何顯示一張BMP圖片

    原子大哥,請問怎么顯示一張BMP圖片,你的那個STMf103RBT6的開發(fā)板的例程中,ILI93XX.c中好像沒有這個函數(shù),而那個圖片顯示
    發(fā)表于 02-19 22:10

    labview如何實(shí)時顯示采集的圖片,目前,可以顯示一張圖片,請問如何做到實(shí)時顯示

    labview做上位機(jī),通過以太網(wǎng)傳輸,如何將OV5640攝像頭采集的JPEG數(shù)據(jù)實(shí)時的顯示出來,目前只能顯示一張圖片,若是要實(shí)時傳輸?shù)脑挘x取的字節(jié)數(shù)如何設(shè)置
    發(fā)表于 04-20 17:10

    請問原理圖里面一張圖片顯示的是什么元件?

    請問原理圖里面一張圖片是什么元件?這是個高壓發(fā)生器。有高手嗎?
    發(fā)表于 06-03 22:50

    分享種利用stm32 OLED顯示一張圖片的方法

    分享種利用stm32 OLED顯示一張圖片的方法
    發(fā)表于 01-21 06:27

    如何在遠(yuǎn)程屏幕顯示圖片

    電子發(fā)燒友網(wǎng)站提供《如何在遠(yuǎn)程屏幕顯示圖片.zip》資料免費(fèi)下載
    發(fā)表于 02-08 14:57 ?0次下載
    如何在遠(yuǎn)程<b class='flag-5'>屏幕</b><b class='flag-5'>上</b><b class='flag-5'>顯示</b><b class='flag-5'>圖片</b>
    主站蜘蛛池模板: 综合激情五月婷婷| 奇米久草| 人人澡人人添| 老师下面好紧| 综合伊人| 亚洲天堂999| 四虎影院永久网站| 日本三级人妇| 另类激情网| 国产成人v爽在线免播放观看| 99r8这里精品热视频免费看| 天天干2018| 久草资源在线播放| 2019国产情侣| 乌克兰一级毛片| 亚洲宅男天堂a在线| 色偷偷91综合久久噜噜| 欧美zoozzooz性欧美| 国产三级一区| 午夜aaaaaaaaa视频在线| 免费观看国产网址你懂的| 五月丁香六月综合缴清无码| 亚洲a视频| 天天色综合久久| 毛片在线看免费版| dy天堂| 免费国产午夜在线观看| 黄色在线观看视频网站| 18美女扒开尿口无遮挡| 色五阁| 国产一级特黄aa大片爽爽| 午夜影院入口| 1024国产手机视频基地| 国产精品久久久久久久久免费观看 | 模特视频一二三区| 二级黄绝大片中国免费视频| 奇米7777影视| 亚洲精品欧洲久久婷婷99| 四虎最新在线| 国产女人和拘做受视频免费| 奇米影视第四色7777|