最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

EasyX繪制透明背景圖的方法詳解

 更新時間:2023年01月06日 10:28:52   作者:Bluemultipl  
這篇文章主要為大家詳細介紹了EasyX繪制透明背景圖的方法,文中的示例代碼講解詳細,對我們深入了解EasyX有一定的幫助,需要的可以參考一下

三元光柵操作

根據在網上的搜索總結得到兩種方案,最常見的繪制帶有透明背景的圖像的方案都是采用如下的源圖像和掩碼圖像疊加來消去邊緣部分:

IMAGE img[2];

loadimage(&img[0], "sun1.png", 100, 100); // 掩碼圖像
loadimage(&img[1], "sun0.png", 100, 100); // 源圖像

putimage(0, 0, &img[0], NOTSRCERASE);   // 掩碼圖與背景或取反
putimage(0, 0, &img[1], SRCINVERT);     // 源圖像與背景異或

直觀理解:由于按位運算是依次對某一位做運算,因此只需要考察一位數字的變化

// 不妨假設白色為 1,黑色為 0

// 需要變成透明的部分,需要顯示最初的背景色
// 背景色為 a,~a 表示反 a,掩碼此部分是黑色 0,源圖像此部分是白色 1
~ (a | 0); //-> ~a 或取反
(~a) ^ 1; //-> a 異或
// 結果仍為背景色

// 需要顯示源圖像的部分
// 背景色為 a,源圖像此部分為 b,掩碼此部分是白色 1
~ (a | 1); //-> 0 或取反(可以看到第一部分與 a 無關)
0 ^ b; //-> b 異或
// 結果為源圖像

然而,上面的方案雖然足夠解決問題,但是未免太過繁瑣,不僅需要源圖像,還需要花時間來制作掩碼圖。最糟糕的就是技術問題導致掩碼圖和原圖不能完全重合,繪制出的圖像有黑邊。

于是,經過長期搜索,終于找到一種不需要掩碼圖,而是直接對圖像進行處理的方案。

優(yōu)化方案

此方案使用了貝葉斯定理來對圖像的每個像素進行計算,原版代碼的具體來源因為時間比較久,已經找不到了。這里的方案和原版本有所不同,因為實際需求,我根據原版本添加了透明度參數 AA ,并且修改了部分代碼使得它與我的需求相契合。

函數聲明為:

void drawAlpha(
    IMAGE* image, 			// 圖像指針
    int x, int y, 			// 輸出坐標
    int width, int height, 	 // 輸出尺寸
    int pic_x, int pic_y, 	 // 圖像中的位置
    double AA = 1			// 透明度
);

也就是說它會在 x,y 位置輸出從圖像中 pic_x,pic_y 位置開始,寬高為 width,height 的部分,且透明度為 AA 。

函數定義部分:

// 繪圖函數,補充透明度 AA
void drawAlpha(IMAGE* image, int x, int y, int width, int height, int pic_x, int pic_y, double AA = 1)
{
	// 變量初始化
	DWORD* dst = GetImageBuffer();			// GetImageBuffer() 函數,用于獲取繪圖設備的顯存指針, EasyX 自帶
	DWORD* draw = GetImageBuffer();
	DWORD* src = GetImageBuffer(image);		// 獲取 picture 的顯存指針
	int imageWidth = image->getwidth();		// 獲取圖片寬度
	int imageHeight = image->getheight();	// 獲取圖片寬度
	int dstX = 0;							// 在 繪圖區(qū)域 顯存里像素的角標
	int srcX = 0;							// 在 image 顯存里像素的角標

	// 實現透明貼圖 公式: Cp=αp*FP+(1-αp)*BP , 貝葉斯定理來進行點顏色的概率計算
	for (int iy = 0; iy < height; iy++)
	{
		for (int ix = 0; ix < width; ix++)
		{
			// 防止越界
			if (ix + pic_x >= 0 && ix + pic_x < imageWidth && iy + pic_y >= 0 && iy + pic_y < imageHeight &&
				ix + x >= 0 && ix + x < WindowWidth && iy + y >= 0 && iy + y < WindowHeight)
			{
				// 獲取像素角標
				int srcX = (ix + pic_x) + (iy + pic_y) * imageWidth;
				dstX = (ix + x) + (iy + y) * WindowWidth;

				int sa = ((src[srcX] & 0xff000000) >> 24) * AA;			// 0xAArrggbb; AA 是透明度
				int sr = ((src[srcX] & 0xff0000) >> 16);				// 獲取 RGB 里的 R
				int sg = ((src[srcX] & 0xff00) >> 8);					// G
				int sb = src[srcX] & 0xff;								// B

				// 設置對應的繪圖區(qū)域像素信息
				int dr = ((dst[dstX] & 0xff0000) >> 16);
				int dg = ((dst[dstX] & 0xff00) >> 8);
				int db = dst[dstX] & 0xff;
				draw[dstX] = ((sr * sa / 255 + dr * (255 - sa) / 255) << 16)  //公式: Cp=αp*FP+(1-αp)*BP  ; αp=sa/255 , FP=sr , BP=dr
					| ((sg * sa / 255 + dg * (255 - sa) / 255) << 8)         //αp=sa/255 , FP=sg , BP=dg
					| (sb * sa / 255 + db * (255 - sa) / 255);              //αp=sa/255 , FP=sb , BP=db
			}
		}
	}
}

注意其中 WindowWidth 和 WindowHeight 都是預先定義的全局變量。實際應用時,先在頭文件中定義窗口尺寸,然后就可以直接使用

IMAGE img;
loadimage(&img, "sun.png", 100, 100);

int x = 100, y = 100;
int width = 50, height = 50;
int pic_x = 50, pic_y = 50;

drawAlpha(img, x, y, width, height, pic_x, pic_y, 0.8);

還可以調整透明度為 0.8 ,比方案 1 更為實用。

到此這篇關于EasyX繪制透明背景圖的方法詳解的文章就介紹到這了,更多相關EasyX繪制透明背景圖內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 淺談C++如何求等差素數列

    淺談C++如何求等差素數列

    這篇文章主要介紹了淺談C++如何求等差素數列,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07
  • C++數據結構之實現循環(huán)順序隊列

    C++數據結構之實現循環(huán)順序隊列

    這篇文章主要介紹了 C++數據結構之實現循環(huán)順序隊列的相關資料,需要的朋友可以參考下
    2017-01-01
  • C語言超詳細講解隊列的實現及代碼

    C語言超詳細講解隊列的實現及代碼

    隊列(Queue)與棧一樣,是一種線性存儲結構,它具有如下特點:隊列中的數據元素遵循“先進先出”(First?In?First?Out)的原則,簡稱FIFO結構。在隊尾添加元素,在隊頭刪除元素
    2022-04-04
  • C++ continue和break語句

    C++ continue和break語句

    這篇文章主要介紹了C++ continue和break語句,文章圍繞continue和break語句的相關資料展開詳細內容,需要的朋友可以參考一下,希望對大家有所幫助
    2021-11-11
  • c++利用vector創(chuàng)建二維數組的幾種方法總結

    c++利用vector創(chuàng)建二維數組的幾種方法總結

    這篇文章主要介紹了c++利用vector創(chuàng)建二維數組的幾種方法總結,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C語言數據結構與算法之鏈表(二)

    C語言數據結構與算法之鏈表(二)

    在這篇文章中,我們將拋開令人頭禿的指針和結構體,我們將另外使用一種數組來實現的方式,叫做模擬鏈表。讓來跟隨小編一起學習學習吧
    2021-12-12
  • C語言詳解關鍵字sizeof與unsigned及signed的用法

    C語言詳解關鍵字sizeof與unsigned及signed的用法

    這篇文章主要為大家詳細介紹了C語言關鍵字sizeof&&unsigned&&signed,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • C++簡明講解缺省參數與函數重載的用法

    C++簡明講解缺省參數與函數重載的用法

    所謂缺省參數,顧名思義,就是在聲明函數的某個參數的時候為之指定一個默認值,在調用該函數的時候如果采用該默認值,你就無須指定該參數。C++ 允許多個函數擁有相同的名字,只要它們的參數列表不同就可以,這就是函數的重載,借助重載,一個函數名可以有多種用途
    2022-06-06
  • Qt5連接并操作PostgreSQL數據庫的實現示例

    Qt5連接并操作PostgreSQL數據庫的實現示例

    本文主要介紹了Qt5連接并操作PostgreSQL數據庫的實現示例,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • 超級詳細講解C++中的多態(tài)

    超級詳細講解C++中的多態(tài)

    多態(tài)是在不同繼承關系的類對象,去調同一函數,產生了不同的行為,下面這篇文章主要給大家介紹了關于C++中多態(tài)的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-05-05

最新評論

浮山县| 沁源县| 盐津县| 青冈县| 泉州市| 八宿县| 汉中市| 寿光市| 东丽区| 棋牌| 巴彦淖尔市| 奎屯市| 分宜县| 绥阳县| 迭部县| 桐城市| 日照市| 成都市| 兴隆县| 利川市| 彩票| 万全县| 寻甸| 蓝田县| 鹤庆县| 罗江县| 诏安县| 通渭县| 沙湾县| 潮安县| 鹤峰县| 永春县| 元谋县| 普宁市| 东宁县| 涪陵区| 延吉市| 泗洪县| 弥勒县| 商河县| 视频|