日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

visual studio(C++)实现“照片电影”播放器

發(fā)布時間:2024/1/1 c/c++ 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 visual studio(C++)实现“照片电影”播放器 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

VS C++實現(xiàn)“照片電影”播放器的軟件架構(gòu)和技術(shù)簡介

前言:
??這個播放器是兩年前我大三時上多媒體課的結(jié)課大作業(yè),代碼部分有瑕疵是肯定的,希望有需要的人能夠自己進(jìn)行代碼優(yōu)化。當(dāng)時我找了好久都沒有用VS C++實現(xiàn)“照片電影”播放器的博客,經(jīng)過幾天的煎熬,我終于想到了如何設(shè)置“定時器”來控制照片的播放和暫停后再播放。此博客僅供分享,如需要源代碼做參考,請訪問我的GitHub賬號:https://github.com/Daisy-gj 。
以下內(nèi)容全部原創(chuàng),轉(zhuǎn)載請聯(lián)系我。

1. 軟件介紹

??本軟件是一款簡易的“照片電影播放器”–支持前端自選背景音樂(可試聽),播放(及多張照片按照一定間隔時間自動逐一顯示)后臺存儲的bmp文件的系統(tǒng)(bmp文件存儲在源文件夾中,使用者可以自行用同名bmp文件更換)。相鄰照片的出現(xiàn)間隔時間可在后臺修改,播放過程中可以暫停播放。

2. 軟件設(shè)計的背景

??本軟件的靈感來自于小米手機(jī)的相冊自帶的小軟件“照片電影”。
手機(jī)上的“照片電影”支持自選照片,音樂,風(fēng)格,并輸出成片保存。但因為我個人水平限制,目前只能做到支持背景音樂選擇,后臺存儲要播放的照片。我嘗試過在可視化結(jié)果界面上添加選擇本機(jī)文件的按鈕,但是選擇文件的面板為Myform與Menu不在同一界面上,無法進(jìn)行有效關(guān)聯(lián),所以放棄了。
??背景音樂支持試聽播放和暫停,我嘗試過使用MediaSession和PlaySound,最終選擇了PlaySound,因為軟件的功能要求對音頻不是很高,使用PlaySound完全可以滿足要求。
?? 在音樂和圖片的播放控制控制方面,我使用了flag(一些bool型的變量)去進(jìn)行狀態(tài)判斷,從而進(jìn)行播放、暫停控制。

3. 使用說明

  • 界面介紹:運行后生成系統(tǒng)的前端界面,如下圖1.0所示。點擊幫助按鈕后,下拉框中點擊使用說明按鈕,彈出dialog中有部分說明,示意圖2.0如下。
    圖1.0 系統(tǒng)主界面
  • 圖2.0 簡易的使用說明 2. 背景音樂:首先,選擇背景音樂。(如果不選擇,則默認(rèn)為TheClassic.wav)選擇音樂前,可以試聽,試聽時可以暫停,也可以切換試聽另外一首音樂。試聽結(jié)束后,選擇您喜歡的一首作為背景音樂,點擊設(shè)為背景音樂按鈕。成功后將彈出提示框如下圖3.0。

    圖3.0 選擇背景音樂成功的提示
  • 播放:選定背景樂后,點擊播放設(shè)置的下拉選擇框中的播放按鈕,將播放源代碼文件中保存的若干張bmp文件,與此同時選定的背景音樂也將同步播放。
  • 圖4.0 播放中的截圖
  • 暫停:點擊播放設(shè)置的下拉選擇框中的暫停按鈕,將停止播放照片和音樂,且系統(tǒng)將暫停。

  • 選擇照片:自選的bmp文件可改為源代碼文件夾中的同名bmp文件,對其進(jìn)行替換,實現(xiàn)自選照片。

  • 退出系統(tǒng):可點擊窗口的叉號退出,也可以點擊系統(tǒng)管理中的退出按鈕進(jìn)行退出。

  • 4. 軟件使用示意視頻

    ? 我很早就卸載VS了····準(zhǔn)備為這個視頻重裝···但VS更新后要求C盤16G空間·····我裝不上。那有需要的去我GitHub下載源碼吧,自己跑吧,保證能用!

    5. 軟件環(huán)境及功能結(jié)構(gòu)圖

  • 軟件環(huán)境及語言
    Microsoft Visual Studio2012
    C++

  • 功能結(jié)構(gòu)
    ?本軟件主要分為兩個模塊:音頻播放,圖片播放。
    (1)音頻播放主要使用的技術(shù):PlaySound
    (2)圖片播放主要使用的技術(shù):LoadImage、GetDIBits(圖片加載)、setTimer(定時器)
    ?下圖5.0為整個系統(tǒng)的功能結(jié)構(gòu)圖:

  • 圖5.0 功能結(jié)構(gòu)圖

    6. 軟件技術(shù)說明

    ??主要寫難點部分—圖片播放。音樂播放、控制、選擇只是簡單的在“分析菜單選擇”中使用palysound()函數(shù)和bool型變量判斷。
    ??①圖片加載方式選擇:
    ??關(guān)于圖片加載到繪圖部分的方式,我嘗試了所有實驗給出的方法,最終選擇了loadimage()。但是loadimage有一個很大的缺陷(我個人在查閱資料后無法解決),就是它無法讀取存儲路徑為char *型的路徑的文件(LPCWSTR格式不匹配,轉(zhuǎn)格式后運行程序無法識別代碼),所以我將所有的文件加了一個int型的變量做控制逐一進(jìn)行加載。但是這樣做很冗余。我的代碼如下:

    if(i==0){hbmp = (HBITMAP)LoadImage(hInstance,L"scenery1.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE); //加載第一幅圖像}if(i==1){hbmp = (HBITMAP)LoadImage(hInstance,L"scenery2.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE); //加載第一幅圖像}if(i==2){hbmp = (HBITMAP)LoadImage(hInstance,L"scenery3.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE); //加載第2幅圖像}if(i==3){hbmp = (HBITMAP)LoadImage(hInstance,L"scenery4.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE); //加載第3幅圖像}if(i==4){hbmp = (HBITMAP)LoadImage(hInstance,L"scenery5.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE); //加載第4幅圖像}if(i==5){hbmp = (HBITMAP)LoadImage(hInstance,L"scenery6.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE); //加載第5幅圖像}if(i==6){hbmp = (HBITMAP)LoadImage(hInstance,L"scenery7.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE); //加載第6幅圖像}if(i==7){hbmp = (HBITMAP)LoadImage(hInstance,L"scenery8.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE); //加載第7幅圖像}if(i==8){hbmp = (HBITMAP)LoadImage(hInstance,L"scenery9.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE); //加載第8幅圖像}if(i==9){hbmp = (HBITMAP)LoadImage(hInstance,L"scenery10.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE); //加載第9幅圖像}GetObject(hbmp,sizeof(BITMAP),&bmp);bi.biSize = sizeof(BITMAPINFOHEADER);bi.biWidth = bmp.bmWidth;bi.biHeight = bmp.bmHeight;bi.biPlanes = bmp.bmPlanes;bi.biBitCount = bmp.bmBitsPixel;bi.biCompression = bmp.bmType;bi.biSizeImage = bmp.bmWidth * bmp.bmHeight * bmp.bmBitsPixel / 8;bi.biXPelsPerMeter = 0;bi.biYPelsPerMeter = 0;bi.biClrImportant = 0;DWORD dwBmpSize = ((bmp.bmWidth * bi.biBitCount + 31) / 32) * 4 * bmp.bmHeight;hDib = GlobalAlloc(GHND,dwBmpSize);lpbitmap = (BYTE*)GlobalLock(hDib);if(i<10){i=i++;}elsei=0;

    ??上述代碼應(yīng)用于定時器調(diào)用的圖片更換函數(shù)changeimg()中。在開始時,應(yīng)就將第一幅圖片加載到繪圖處,因為定時器是只要運行就直接開始調(diào)用圖片更替函數(shù)的,所以開始顯示部分不能沒有圖片。
    ??②定時器更新圖片后圖片的加載問題:
    ?? 因為繪圖部分(WM_PAINT)是只有當(dāng)窗體的無效區(qū)發(fā)生變化后才能重新更新繪圖的,所以,定時器的更新圖片的結(jié)果無法自動的顯示到繪圖區(qū)(如果不加以處理)。
    ??為了解決這個問題,我嘗試在WM_TIMER中增加updateWindows()函數(shù),但是沒有作用(要起作用就必須調(diào)整窗口,給窗口一個信號)。最終,我想起了“水波紋”實驗中的動態(tài)的“水波紋”的顯示,其原理與我要做的圖片播放器原理相同,所以我最終在WM_TIMER中做出了如下更改:

    //在主窗口過程中 case WM_TIMER:hdc = GetDC (hWnd);if(FLAG2) //按下了播放按鈕且沒有按下暫停按鈕{ //更新圖片--開始播放直到暫停changeimg();GetDIBits(hdc,hbmp,0,(UINT)bmp.bmHeight,lpbitmap,(BITMAPINFO*)&bi,DIB_RGB_COLORS);SetDIBitsToDevice(hdc,20,20,bi.biWidth,bi.biHeight,0,0,0,bi.biHeight,lpbitmap,(BITMAPINFO *)&bi,DIB_RGB_COLORS);ReleaseDC (hWnd, hdc);}break;

    ??簡單來說,就是每次定時器調(diào)用了更新圖片函數(shù)后,就會將這個圖片直接加載到繪圖區(qū),不需要通過WM_PAINT進(jìn)行繪圖。
    ??③音樂與圖片播放的同步控制:
    ?? 這個實現(xiàn)起來很簡單,就是在“分析菜單”處,點擊播放的情況下,將播放圖片控制的flag變?yōu)閠rue,同時在case中使用playsound函數(shù)播放音樂。點擊暫停的情況下,將播放圖片控制的flag變?yōu)閒alse,同時在case中使用playsound(null…)函數(shù)。代碼如下:

    //播放按鈕的點擊case ID_START: FLAG2=true; //改變播放控制的標(biāo)號if(FLAG1) //進(jìn)行了音樂選擇,則播放選擇的音樂{if(music==1) PlaySound(L"TheClassic.wav", NULL, SND_ASYNC);//選擇了經(jīng)典音樂if(music==2) PlaySound(L"DJ Okawari - Flower Dance.wav", NULL, SND_ASYNC);//選擇了時尚音樂}else //不選擇則為默認(rèn)的經(jīng)典音樂PlaySound(L"TheClassic.wav", NULL, SND_ASYNC); break;//暫停按鈕的點擊case ID_STOP: FLAG2=false; //暫停播放控制的標(biāo)號PlaySound(NULL, NULL, SND_ASYNC);break;

    7. 心得體會

    ??底層的東西要做實際的應(yīng)用還是比較復(fù)雜的。開始時,我想著做一個與手機(jī)上功能類似的照片電影播放器,但是最終因為沒法實現(xiàn)淡入淡出、人臉(重要位置)放大縮小等就與實際產(chǎn)品產(chǎn)生了差距。但是在實踐的過程中,我覺得以后要做一個軟件還是要選擇合適的環(huán)境和語言,這次的播放器因為個人水平限制和語言的庫函數(shù)的限制,就很難做好功能。同時也讓我明白了,查函數(shù)的手冊的重要性,好多函數(shù)理解意思后很容易就能實現(xiàn)想要的功能,而不用自己去編寫。
    ??再次提醒,本程序的源代碼在我的GitHub上可下載完整可運行的:https://github.com/Daisy-gj

    總結(jié)

    以上是生活随笔為你收集整理的visual studio(C++)实现“照片电影”播放器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。