當前位置:首頁 » 編程語言 » 利用c語言使圖像產生馬賽克效果
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

利用c語言使圖像產生馬賽克效果

發布時間: 2022-09-22 18:43:34

㈠ 怎麼鈍化放大圖片產生的馬賽克

點陣圖放大就 會產生馬賽克,而矢量圖不會,你所做的就是要把點陣圖轉化為矢量圖即可,使用矢量圖軟體來實現,FLASH MX及5.0中點陣圖轉化矢量圖的方法在導入點陣圖時,flash會將其作為單個對象處理。如果要縮小文件大小或對導入的點陣圖進行編輯,則可以使用modify(修改)>Trace Bitmap(描摹點陣圖)命令。該命令可使點陣圖轉化為矢量圖形。在將點陣圖轉換為矢量圖形後,矢量圖形不再連接到庫面板中的點陣圖圖像符號。步驟如下:1 選中當前場景中的點陣圖2 單擊modify(修改)>Trace Bitmap(描摹點陣圖)命令3 在color Threshold(顏色閥值)框中輸入顏色閥值,范圍1-500圖像的轉換有一個比較像素的過程,在比較兩個像素時,如果RGB顏色值中的差異小於顏色閥值,則可以認為這兩個像素是相同的顏色。因此,顏色閥值越高,則數量越少。4 在Minimum Area(最小區域)框中輸入一個值,設置當前分配顏色給像素時要考慮的周邊像素數目。5 單擊Curve Fit(曲線適應)下拉列表,從中選擇一個確定輪廓繪制的方式。該列表所包含的選項:默認值Normal(普通),表示取中值。Pixels表示以像素為單位繪制輪廓,效果好,但文件量大。6 在Corner Threshold(角閥值)下拉列表中選一個值,確定對於原圖中角的處理方式。其中Many Corner表示要鈍化邊角,使之平滑,Few Corner表示要銳化邊角,使較粗糙。Normal是中間值。放大後再保存就可以實現你的要求,只不過方法麻煩點,

㈡ 請問這是什麼作圖軟體里的馬賽克那個塗在文字里顏色是怎麼弄的是用什麼軟體製作的

有一些圖片不想讓別人看到,需要添加馬賽克,用專業的ps等工具太麻煩。如何用windows自帶畫圖工具給圖片製作馬賽克效果?
工具/原料
畫圖工具
方法/步驟
1/7 分步閱讀
一張圖,想添加馬賽克。

展開長圖
2/7
右鍵,用畫圖打開。

查看剩餘1張圖
3/7
用「選擇」工具,選取需要馬賽克的區域。

查看剩餘1張圖
4/7
關鍵一步,滑鼠拖動一點,使圖片縮至極小,松開滑鼠。
5/7
再用滑鼠拉住一點,使圖片放大至原圖大小,松開滑鼠。
馬賽克效果出現。
6/7
保存。對比。
查看剩餘1張圖
7/7
很方便。
注意事項
如果本經驗對你有幫助,請下面投票支持!
製作
編輯於2014-12-16,內容僅供參考並受版權保護
贊 踩分享
閱讀全文
發酵罐 江蘇科海生物工程設備有限...
發酵罐 , 專業的品牌 , 發酵設備 , 專業設計製造 , 生物反應器 , 為客戶提..
kehai818.com廣告
鷹潭 轉讓二手成套發酵罐 9成新...
簽合同合作 負責上門安裝 調試運作正常後付款 9成新設備價格只有5成 包用 ..
banguachejiagew.com廣告
相關經驗
圖片的局部馬賽克效果怎麼製作 閱讀 9
快速給圖片打馬賽克 閱讀 121
windows畫圖工具打馬賽克 閱讀 189
怎麼去除馬賽克看原圖 閱讀 26449
巧用畫圖工具做馬賽克/擦除文字 閱讀 420
相關推薦
馬賽克拼圖繪圖工具套裝皮膚變白最快

c語言圖像處理

c語言不自帶圖形處理方面的東西。TC特有的頭文件graphics.h,其他編譯環境都用不了,可移植性是零。而且TC實在太老,與現在c語言標准差距非常大。基本是無法運行現在的代碼。所以不太建議你用它。

非要用純c,可以自己寫函數調用WindowsAP和GUI介面。而且需要包含windows.h頭文件。

網上有個大神用c—free寫的代碼在附件里。

/*
純C通過WindowsAPI編寫的基本Windows圖形界面
整理加原創,基本上每一句代碼都有注釋
通過C-Free3.5編譯
*/

#include<string.h>//這個頭文件在擴展名為.c時是不需要加的
#include<windows.h>//windowsapi必須包含的頭文件

LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);//窗口函數的前向聲明

//參數說明:
//HINSTANCEhInstance當前實例句柄
//HINSTANCEhPrevInstance以前版本的遺留產物,現在總是置為NULL
//LPSTRlpCmdLine命令行的產生,可以從開始->獲得程序運行的參數,由此傳入
//intnCmdShow程序最初的顯示模式,正常,最大化或最小化

//主函數的入口是WinMain,類型為int
//WINAPI標志是一種特定的調用,它定義了一種生成機器代碼和放置函數參數的方式

intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRlpcmdLine,intnCmdShow)
{
//TCHAR,TEXT都是統一單位元組和雙位元組字元的類型,建議使用
staticTCHARszAppName[]=TEXT("MyFirstWindows");
staticTCHARszClassName[]=TEXT("MFWClass");
HWNDhwnd;//一定一個窗口句柄
MSGmsg;//定義一個消息結構體
WNDCLASSwndclass;//定義一個WNDCLASS結構用於注冊窗口

wndclass.style=CS_HREDRAW|CS_VREDRAW;//窗口類的類風格,每當水平和垂直大小改變時完全刷新窗口
wndclass.lpfnWndProc=WndProc;//此窗口類所使用的窗口函數的入口地址
wndclass.cbClsExtra=0;//用於在類結構中預留一些額外的空間
wndclass.cbWndExtra=0;//用於在windows內部保存的窗口結構中預留一些額外的空間
wndclass.hInstance=hInstance;//指定所在程序的實例句柄
wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);//定製圖標
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);//定製滑鼠圖形
wndclass.hbrBackground=(HBRUSH)GetStockObject(GRAY_BRUSH);//定義背景顏色
wndclass.lpszMenuName=NULL;//指定窗口類的菜單
wndclass.lpszClassName=szClassName;//指定窗口類的類名


//注冊窗口,參數為指向WNDCLASS結構的指針
//如果注冊不成功,則彈出一個對話框說明情況
//MessageBox是僅有的可以在舊版本和新版本windows都可以運行的對話框

if(!RegisterClass(&wndclass))
{
MessageBox(NULL,TEXT("!"),szAppName,MB_ICONERROR);
return0;
}

//創建窗口
hwnd=CreateWindow(
szClassName,//窗口類的名稱
TEXT("Title:MyFirstWindowsProgram.這里是標題"),//窗口標題
//WS_OVERLAPPEDWINDOW,//窗口顯示風格,這行實際是一個預定義,相當於下面的集合,可以單獨設置
WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_THICKFRAME|WS_MINIMIZEBOX|WS_MAXIMIZEBOX,
CW_USEDEFAULT,//初始x方向的位置
CW_USEDEFAULT,//初始y方向的位置
CW_USEDEFAULT,//初始x方向的大小
CW_USEDEFAULT,//初始y方向的大小
NULL,//父窗口句柄
NULL,//菜單句柄
hInstance,//程序實例句柄
NULL);//創建參數


//顯示窗口,第一個參數hwnd是CreateWindow所創建的窗口的句柄
//第二個參數nCmdShow是主函數給的,由快捷方式獲得
ShowWindow(hwnd,nCmdShow);

//刷新窗口,給窗口函數,在本程序中即WndProc發送一個WM_PAINT
UpdateWindow(hwnd);

//消息循環
while(GetMessage(&msg,NULL,0,0))//接受自己創建的所有窗口的所有消息
{
TranslateMessage(&msg);//將msg結構體傳給windows以進行一些鍵盤轉換,即將擊鍵消息轉換為字元消息
DispatchMessage(&msg);//再次將msg結構體傳給windows,由windows將該消息發送給適當的窗口函數
}

return(int)msg.wParam;
}

//窗口函數
//參數說明:
//HWNDhwnd,接受消息的窗口句柄,由CreateWindow函數返回
//UINTmessage,消息標志符,用以標識消息,每個消息均有一個唯一對應的消息標識符
//WPARAMwParam,是WORDPARAM的意思,一個32位的消息參數,其含義和數值根據消息的不同而不同
//LPARAMlParam,是LONGPARAM的意思,一個32位的消息參數,其值和消息有關

//CALLBACK函數指由程序員定義,編程實現,而由windows系統調用的函數
LRESULTCALLBACKWndProc(HWNDhwnd,UINTmessage,WPARAMwParam,LPARAMlParam)
{
HDChdc;//定義一個設備描述表句柄結構體

//定義一個PAINTSTRUCT的繪制信息結構體,
//其包含了包含了當前無效矩形區域的坐標和其他信息,用於刷新用戶區的內容
PAINTSTRUCTps;

RECTrect;//定義一個RECT結構體,其有left,top,right,bottom四個域

//處理傳進的各種消息
switch(message)
{
//窗口創建
caseWM_CREATE:MessageBox(NULL,"MessageContent:ThisisWM_CREATE,這是WM_CREATE。",
"MessageTiTle這是對話框的標題",MB_OK);
return0;

//窗口繪制
caseWM_PAINT:hdc=BeginPaint(hwnd,&ps);//由BeginPaint開始,返回設備描述表以開始繪圖
GetClientRect(hwnd,&rect);//獲取用戶區域的大小

//格式話文本輸出
DrawText(hdc,TEXT("WindowsContent:Iamadeveloper.我為計算機而生。"),
-1,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);
EndPaint(hwnd,&ps);//以EndPaint結束,釋放設備描述表句柄
return0;
//窗口消亡
caseWM_DESTROY:MessageBox(NULL,"MessageContent:ThisisWM_DESTROY,這是WM_DESTROY。",
"MessageTiTle這是對話框的標題",MB_OK);
PostQuitMessage(0);
return0;
}

//凡是窗口函數不予處理的消息應交由windows默認消息處理函數DefWindowProc處理
returnDefWindowProc(hwnd,message,wParam,lParam);
}

㈣ 可以使圖片上被馬賽克這些東西遮住的部分顯示出來

我聽說過電影可以。但是圖片可能不行吧!
就我了解好像不行。
又不是.psd photoshop的文件。分層的。把馬賽克所在的層刪掉就可以。jpg等應該只有一層。所以應該不行。

㈤ 消除馬賽克

解馬賽克軟體(GMASK) v1.70 綠色漢化版 http://soft.yiiu.com/Software/Catalog11/758.html

恢復本來面目 消除JPEG圖片馬賽克

--------------------------------------------------------------------------------

www.pecc.cn 2003-12-10 來源:中國茶城 商城 - 企業 - 投稿

文/黃傑雲

我們從網上下載圖片時,經常會發現圖片存在不同程度的馬賽克。這是因為用JPEG格式對圖片進行保存時,設置的壓縮率過高。如何消除這些馬賽克,使圖片中的景物恢復平滑呢?大家可能首先會想到Photoshop,其實「殺雞焉用牛刀」,用Jpeg Fixer這個小工具即可輕松解決,它可以幫助我們最大限度地消除JPEG圖片中的馬賽克,使圖片恢復其本來的面目。

操作步驟:

首先在「Source Image」中打開需要修復的JPEG圖片(如圖1),這張圖片會顯示在界面左邊的「Source Image」窗口中;右邊的「Result」窗口是修復效果預覽窗,修復後的效果在這里可以清楚地看到。當圖片載入後,程序自動以默認的設置對圖片進行修復,從圖1的效果來看,是很令人滿意的。

圖1

如果你覺得默認設置所修復的效果不夠理想,還可以用滑鼠拖動窗口下方的「Filter strength」滑桿來進行調整,滑桿越往右,消除馬賽克的效果就越明顯。在拖動滑桿時,通過預覽窗內紅色虛線框中的圖像,可以實時看到修復效果,滿意後按下「Process」按鈕即可開始進行修復。

另外,在「Source Image」界面下方有一個「Advanced」選項按鈕,點擊進入後還可以分別對「Blotchy look removal 」、 「Artifacts removal」以及「Contrast enhance」三個項目進行調整,從而能夠更有針對性地對馬賽克進行消除。

圖2

如果還不滿意,可以進入程序中的「More tool」菜單,打開一個叫做「Median noise rection」的工具(如圖2),圖像在消除馬賽克後,還可以用它來進一步減少圖像中的噪點。但從使用的效果來看,這個工具在去除圖像噪點的同時會使一些圖像細節變得模糊,因此對於一些細節要求較高的圖片,在使用這個工具時,「Radius」的值不要設得太高。

下載地址:http://www.superdown.com/soft/7016.htm
參考資料:http://www.pecc.cn/info.SMDX?id=2763&zl=%C8%ED%BC%FE%C6%C0%B2%E2

㈥ 如何利用c語言實現像素圖形的輸出

1、可以變成灰度圖也可以不變。這里假設你的圖像都是IPL_DEPTH_8U類型。

2、如果變成灰度圖,就是單通道圖像,獲取的就是每一個像素點的灰度值。
IplImage* img = cvLoadImage("test.bmp", 0);
for (int i = 0; i < img->height; i++)
{
for (int j = 0; j < img->width; j++)
{
//方法一:使用cvGet2D()函數間接訪問
CvScalar s = cvGet2D(img, i, j); //其中i代表y軸(第i行),即height;j代表x軸(第j列),即width。
printf("gray value=%f\n",s.val[0]);

//方法二:使用直接訪問
uchar val = ((uchar *)(img->imageData + i*img->widthStep))[j]; //i和j的意義同上
printf("gray value=%d\n",val);
}
}

3、如果不變成灰度圖,就是3通道圖像,獲取的就是每一個像素點的BGR值,然後分別獲取B值,G值和R值。
IplImage* img = cvLoadImage("test.bmp", 1);
for (int i = 0; i < img->height; i++)
{
for (int j = 0; j < img->width; j++)
{
//方法一:使用cvGet2D()函數間接訪問
CvScalar s=cvGet2D(img,i,j); //其中i代表y軸(第i行),即height;j代表x軸(第j列),即width。
printf("B=%f, G=%f, R=%f\n",s.val[0],s.val[1],s.val[2]); //注意是BGR順序

//方法二:使用直接訪問
int bVal = ((uchar *)(img->imageData + i*img->widthStep))[j*img->nChannels + 0]; // B
int gVal = ((uchar *)(img->imageData + i*img->widthStep))[j*img->nChannels + 1]; // G
int rVal = ((uchar *)(img->imageData + i*img->widthStep))[j*img->nChannels + 2]; // R
printf("B=%d, G=%d, R=%d\n",bVal,gVal,rVal); //注意是BGR順序
}
}

㈦ 如何用gmask去除圖片的馬賽克

利用GMask這個圖像處理軟體,可以快速地為圖片製作復雜而有效率的馬賽克效果,讓不宜觀看此圖片的人不會受到「視覺傷害」,而且如果是圖片的「加工」者,也可以隨時「逆向操作」,獲得原始的圖像。
意思是如果有母片。可以去掉。如果沒有母片,那必須有次母片,也就是未壓縮放出片,不過修復的要求很高。

從網上下載的馬賽克圖片是不可能去掉的, 這不是一個可逆的過程,加入馬賽克的手法有很多, 比如黑白轉換、灰度圖轉換、旋轉、銳化處理、平滑處理、曝光處理、浮雕處理、逆反處理、霓虹處理、馬賽克處理、擴散處理、柔化處理、查找邊緣等等, 相對應的會改變原始圖片的最基本的二進制代碼信息, 從網上下下來的圖片本身就缺少這些信息, 所以想要去掉馬賽克是幾乎不可能, 除非能知道當初對這個圖片是如何加入馬賽克的——也就是知道加入馬賽克手法的相應次序, 在對應的取逆操作還原回原來的圖片, 不過前提是最基本的信息要有。
現在標榜去除馬賽克的大多是對其模糊化, 使馬賽克不那麼明顯, 但是不能根本上的消除馬賽克。

㈧ 圖片去馬賽克教程

圖片去馬賽克教程分析如下:
1、首先利用PS打開要處理的含有馬賽克的圖片。
2、雙擊背景層,將其轉換為普通圖層「圖層0」。
3、接下來,點擊「選區工具」,然後選擇要消除馬賽克的區域,執行「濾鏡」→「銳化」→「智能銳化」。
4、適當的增加「數量」和「半徑」,使馬賽克部分對比度增強,同時看起來顯得更容易區分。
5、點擊「選擇」→「取消選擇」項來取消選區,然後選擇「仿製圖章工具」。
6、按住「Alt」鍵不放,點擊要采樣的區域,然後不斷塗抹要應用的位置,從而不斷取消馬賽克部分的圖像。
7、通過不斷選擇周圍的部分來使相鄰部分的圖像盡量保持一致。

㈨ GBA高手請進!!

一. GBA開發包--DevKitAdv 簡介
DevKitAdv 主要包括兩部分,一是GCC++編譯器,二是 GBA庫.

GCC++編譯器功能和我們常用的VC差不多,只不過少了個編輯源代碼的文本編輯器(至少我沒發現,我用的是EditPlus,UltraEdit也可以),還有就是--不支持類(class),真是讓人頭痛,只能用struct來替代.它的作用是把我們寫的代碼編譯成二進制的可執行文件,當然這個可執行文件是相對GBA和GBA模擬器而言的.就象Windows里的EXE文件無法在Mac機上使用是一樣的道理;

GBA庫提供了圖像,控制及聲音一系列的函數,和GCC++配合使用.

二. DevKitAdv 的安裝

沒啥好說的,解壓後就可以直接使用,編譯時設置DevKitAdv的路徑就可以了,建議做一個批處理文件,比如 go.bat

set PATH=d:\devkitadv\bin;%PATH%

cmd (win98是command)

三. 最簡單的 GBA 程序 (t1)

// main.c
// 一些基本數據類型
typedef unsigned char u8;
typedef unsigned short u16;
typedef unsigned long u32;
#define REG_DISPCNT *(u16*)0x04000000 // 顯示寄存器地址
#define VRAM 0x06000000 // 圖像緩沖區地址
#define M5_VRAM 0x0600A000 // M5緩沖區地址
#define BACKBUFFER 0x010 // 雙緩沖/背緩沖地址
#define PALETTE 0x5000000 // 調色板地址
#define MODE_3 0x03 // 240*160 15bits/單緩沖區
#define MODE_4 0x04 // 240*160 8bits/雙緩沖區
#define MODE_5 0x05 // 160*128 15bits/雙緩沖區
#define BG2_ENABLE 0x0400 // BG_2
#define SetMode(Mode) REG_DISPCNT=(Mode) // 設置顯示模式的宏定義

// ----------- 主程序 ------------
int main()
{
//設置屏幕模式,這里使用MODE_4
SetMode (MODE_4 | BG2_ENABLE);
}

1.MODE_5和MODE_3都是16bits,但MODE_3隻有單緩沖,製作動畫效果肯定沒雙緩沖好,因此排除MODE_3;

2.MODE_4是8bits,理論上256色對於掌機夠用了,雖然16bits真彩的誘惑沒有人想抗拒,可MODE_5隻有160*128咧,在實際應用中建議還是使用MODE_4.

很簡單吧--的確是的,現在要用GCC編譯它:

gcc -lm -o main.elf main.c

obj -v -O binary main.elf main.bin

你會看目錄下多了個"main.bin",這個就是能在GBA模擬器上執行的二進制文件!
教程中t1-t10目錄為源程序目錄,裡面有個make.bat,修改代碼後直接執行它就可以編譯,但要注意我的devkitadv是裝在D:,你要是裝在別的盤就得改一下make.bat的path參數.

四. 在MODE_4背景層畫圖的 GBA 程序 (t2)

在GBA的MODE_4里畫一幅圖要經過3個步驟:

1. 把原始256色圖像文件轉換成 *.h / *.c 的數據文件,我們用的是 < BMP2GBA > ,這里以"image.bmp"為例,轉換後我們就得到了一個"image.h"文件;

2. 在程序開頭#include "image.h",這樣就能在程序中使用"image.h"定義的調色板和圖像數據;

3. 在程序中把"image.h"定義的調色板和圖像數據寫入MODE_4背景層的調色板和圖像緩沖區.

另外,GBA還有專為精靈設置的物體層,它的用法和背景層一樣,只是功能有點不一樣,地址是0x06000000.有關用這里就不詳細說了,大家可以把精靈數據直接輸出到物體緩沖區就可以了.

下面是源程序:

... ...

// 包含圖像調色板和數據的頭文件
#include "gfx/image.h"

// ----------- 全局變數 --------
// 系統調色板
u16* palette_mem=(u16*)PALETTE;
// 圖像緩沖區
u16* video_buffer=(u16*)VRAM;

// ----------- 函數定義 ---------
// MODE_4繪圖函數
void Draw(u16* src_palette,u16* src_data,u16* dst_palette,u16* dst_data);

// ----------- 主程序 ------------
int main()
{

// 設置屏幕模式,這里使用MODE_4
SetMode (MODE_4 | BG2_ENABLE);

// 在背景層畫圖,Palette和Data是在"image.h"定義的調色板和圖像數據數組名
Draw(Palette,Data,palette_mem,video_buffer);
}

// MODE_4繪圖函數
void Draw(u16* src_palette,u16* src_data,u16* dst_palette,u16* dst_data)
{
int loop,x,y;

// 寫入目的調色板
for(loop = 0; loop < 256; loop++)
dst_palette[loop] = src_palette[loop];

// 寫入圖像緩沖區
for(x = 0; x < 120; x++)
{
for(y = 0; y < 160; y++)
{
dst_data[(y) *120 + (x)]=src_data[(y) *120 + (x)];
}
}
}

編譯後得到main.bin,然後在GBA模擬器里運行,就可以得到這樣的結果:
五. 在MODE_5畫圖的 GBA 程序 (t3)

在GBA的MODE_5里畫一幅圖也要經過相似3個步驟,只不過不需要調色板數據:

1. 把原始真彩圖像文件轉換成 *.h / *.c 的數據文件,我們用的是 < Targa2GBA > ,這里以"image.bmp"(240*160)為例,DOS窗口下進Targa2GBA目錄,輸入"t2g mode5 image.bmp image.h",轉換後我們就得到了一個"image.h"文件;

2. 在程序開頭#include "image.h",這樣就能在程序中使用"image.h"定義的圖像數據;

3. 在程序中把"image.h"定義的圖像數據寫入圖像緩沖區.

下面就是源程序:

// 包含圖像數據的頭文件
#include "gfx/image.h"

// ----------- 全局變數 --------
// 圖像緩沖區
u16* video_buffer=(u16*)VRAM;

// ----------- 函數定義 ---------
// MODE_5繪圖函數
void Draw(int x,int y,int w,int h,u16 *src_data,u16 *dst_data);

// ----------- 主程序 ------------
int main()
{
// 設置屏幕模式,這里使用MODE_5
SetMode (MODE_5 | BG2_ENABLE);

// 在背景層畫圖,image是在"image.h"定義的圖像數據數組名
Draw(0,0,240,160,image,video_buffer);
}

// MODE_5繪圖函數
void Draw(int x,int y,int w,int h,u16 *src_data,u16 *dst_data)
{
int i,o,idst;

// 把源圖像數據復制到圖像緩沖區的指定地方
idst =(y*160)+x;
for (i=0;i<h;i++)
{
for (o=0;o<w;o++)
{
if (*src_data != 0)
{
dst_data[idst] = *src_data;
}
idst++;
src_data++;
}
idst += (160-w);
}
}

編譯後運行結果:
六. 全屏顯示的 MODE_5 GBA 程序 (t4)

由於GBA不支持線性的圖像變換,因此得到的結果會產生一些馬賽克的現象,現在還是附上這個變換函數和最終結果,其實質量還是可以接受的,大家可以試試使用這個新的MODE_5.

// 切換到新MODE_5全屏模式,page為緩沖區,原理是把顯示寄存器數據X,Y交換,得到128*160的顯示,GBA就會全屏顯示.
void SetFlipMode(int page)
{
u16 *ioreg=(u16*)0x4000000;

*ioreg=5+((page&1)>>4)+(1>>10);
ioreg[0x10]=0;
ioreg[0x11]=256;
ioreg[0x12]=128;
ioreg[0x13]=0;
}

int main()
{
// 設置屏幕模式,這里使用MODE_5
SetMode (MODE_5 | BG2_ENABLE);

// 切換模式
SetFlipMode(0);

// 在背景層畫圖,image是在"image.h"定義的圖像數據數組名
Draw(0,0,240,160,image,video_buffer);

r七. GBA的雙緩沖顯示(t5)

大家在做上面MODEL_5的程序時一定會發現圖像在閃動(第六節的240*160的MM象被破了相...),而MODEL_4下卻比較穩定--這是因為MODEL_5下要處理16bits(實質上是15bits)的圖像,數據量比MODEL_4下的8bits大很多,在沒使用雙緩沖的情況下,圖像填充時就會造成閃爍,這就是為什麼我們拋棄了MODEL_3的原因...

原理也很簡單,圖像在背緩沖區里填充好之後再直接輸出到前緩沖區顯示,程序里就是一個 "等待同步-> 交換緩沖" 的過程:

... ...
// ----------- 全局變數 --------
// 圖像緩沖區
u16* video_buffer=(u16*)M5_VRAM;

// ----------- 函數定義 ---------
... ...

// 等待緩沖區數據同步
void WaitSync ();
// 交換緩沖區內容
void SwapScreen ();

// ----------- 主程序 ------------
int main()
{

// 設置屏幕模式,這里使用MODE_5
SetMode (MODE_5 | BG2_ENABLE);

while(1)
{
// 在背景層畫圖,image是在"image.h"定義的圖像數據數組名
Draw(0,0,240,160,image,video_buffer);
WaitSync();
SwapScreen();
}
}

// 等待緩沖區數據同步
void WaitSync ()
{
while (*(volatile u16*)0x4000006<160) {};
}

// 交換緩沖區
void SwapScreen ()
{
if (REG_DISPCNT & BACKBUFFER)
{
REG_DISPCNT &= ~BACKBUFFER;
video_buffer = (u16*) M5_VRAM;
}
else
{
REG_DISPCNT |= BACKBUFFER;
video_buffer = (u16*) VRAM;
}
}

八. GBA 的按鍵輸入(t6)

講了老半天的圖像,雖說是對著MM,但大家一定也有點煩了,我們現在就換個方向,來看看GBA的控制.

... ...
// 按鍵控制
#define KEY_A 1
#define KEY_B 2
#define KEY_SELECT 4
#define KEY_START 8
#define KEY_RIGHT 16
#define KEY_LEFT 32
#define KEY_UP 64
#define KEY_DOWN 128
#define KEY_R 256
#define KEY_L 512
volatile u32* KEYS = (volatile u32*)0x04000130;

// 包含圖像調色板和數據的頭文件
#include "gfx/image.h"

// ----------- 全局變數 --------
// 圖像緩沖區
u16* video_buffer=(u16*)M5_VRAM;
// 圖像顯示坐標
int img_x,img_y;

// ----------- 函數定義 ---------
// 按鍵控制
void KeyAction();
... ...
// ----------- 主程序 ------------
int main()
{

// 設置屏幕模式,這里使用MODE_5
SetMode (MODE_5 | BG2_ENABLE);

while(1)
{
// 處理按鍵事件
KeyAction();
// 在背景層畫圖,image是在"image.h"定義的圖像數據數組名
Draw(img_x,img_y,96,64,image,video_buffer);

WaitSync();
SwapScreen();
}
}

// 處理按鍵事件
void KeyAction()
{
// 上方向鍵
if(! ( (*KEYS) & KEY_UP) )
{
img_y+=5;
}

// 下方向鍵
if(! ( (*KEYS) & KEY_DOWN) )
{
img_y-=5;
}
}
eturn(0);
九. 簡單聲音輸出(t7)

Simple is the Best(簡潔至上),這里我們使用一個現成的聲音模塊(Troff Player,by Vova & Serge).這里還要用到一個轉換工具< MOD2GBA >,用來把MOD音樂文件轉換成GBA的 *.c / *.h 聲音數據文件.MOD和MIDI差不多,但支持更多更強的效果.MOD可以由konvertor這個強大的軟體轉換而來.

// MOD數據文件
#include "song_data.h"
// MOD播放函數文件
#include "modplayer.h"

// ----------- 主程序 ------------
int main()
{
//設置屏幕模式,這里使用MODE_4
SetMode (MODE_4 | BG2_ENABLE);

// 初始化聲音(聲道數,音量)
InitSound(2, 7);
// 初始化音樂(節拍,循環)
InitSong(20000, 0);

while(1)
{
// 更新音樂播放狀態
UpdateSong();
}
}

OK,就這么EZ.

十. 用圖塊建立可滾動/縮放/旋轉的背景(t8)

這一節主要是源程序中注釋為主,這里就不詳細說明了."gba.h"包含基本宏定義,"maths.h"是sin/cos乘256後的值數組,"main.h"包括了我們定義背景結構及操作背景的函數.

程序中的地圖背景是由不同的圖塊所構成,而這些圖塊統一緊挨著放在一個圖像文件,這樣每個圖塊就會有一個索引號;地圖信息只要記錄這張地圖里共有多少個 單位(圖塊)以及每個單位對應的圖塊索引號就OK了,在例子中"gfx/tiles.h"就是圖塊大本營,而"gfx/level1.h"則是圖塊索引排列表.地圖工具為"map editor beta 4".

㈩ 手機里的照片如何打馬賽克

可參考vivo手機的方法:進入相冊--點開某張圖片--左下角「編輯」--馬賽克中選擇馬賽克形式操作即可。