圖片縮放算法

項目背景:博主之前做過一個攝像頭采集數據,然后在LCD上顯示視頻數據的項目,假如我們攝像頭采集的一幀數據的分辨率比我們的LCD的分辨率要大,那么LCD則無法顯示整個圖像,這時候我們就要把這么一幀圖片進行縮放,然后再顯示在LCD上。

?

本文采用的是近鄰取樣插值方法縮放圖片,比如原圖有100個點,想縮放10倍的話,那就要取10個點,(點的編號)比如0 10 20 30 。。。100(其他點就不要了)。

下面我們直接通過程序來分析:首先我們用? 輸入分辨率/壓縮后的分辨率? 可得到一個縮放比例值k,根據這個k值找出我們要保存原圖上哪些豎線橫線。橫線和豎線的交點就是我們要保存的點。

/*********************************************************************** 函數名稱: PicZoom* 功能描述: 近鄰取樣插值方法縮放圖片*            注意該函數會分配內存來存放縮放后的圖片,用完后要用free函數釋放掉*            "近鄰取樣插值"的原理請參考網友"lantianyu520"所著的"圖像縮放算法"* 輸入參數: ptOriginPic - 內含原始圖片的象素數據*            ptBigPic    - 內含縮放后的圖片的象素數據* 輸出參數: 無* 返 回 值: 0 - 成功, 其他值 - 失敗***********************************************************************/
int PicZoom(PT_PixelDatas ptOriginPic, PT_PixelDatas ptZoomPic)
{unsigned long dwDstWidth = ptZoomPic->iWidth;//壓縮后分辨率的寬度值unsigned long* pdwSrcXTable;unsigned long x;unsigned long y;unsigned long dwSrcY;unsigned char *pucDest;unsigned char *pucSrc;unsigned long dwPixelBytes = ptOriginPic->iBpp/8;if (ptOriginPic->iBpp != ptZoomPic->iBpp){return -1;}//pdwSrcXTable數組用來存放要保存的是哪些“豎線”(保存上圖紅色豎線的位置)pdwSrcXTable = malloc(sizeof(unsigned long) * dwDstWidth);if (NULL == pdwSrcXTable){DBG_PRINTF("malloc error!\n");return -1;}//pdwSrcXTable數組用來存放要保存的是哪些“豎線”(保存上圖紅色豎線的位置)for (x = 0; x < dwDstWidth; x++)//生成表 pdwSrcXTable{pdwSrcXTable[x]=(x*ptOriginPic->iWidth/ptZoomPic->iWidth);}//循環“壓縮后圖片的分辨率的高度”次,也就是開始把要留下的點放進輸出buffer了for (y = 0; y < ptZoomPic->iHeight; y++){		//找出每一次要保存的“橫線”	dwSrcY = (y * ptOriginPic->iHeight / ptZoomPic->iHeight);//目的的起始地址pucDest = ptZoomPic->aucPixelDatas + y*ptZoomPic->iLineBytes;//源的起始地址(橫線的位置是每個點的起始地址,豎線的位置是偏移位置)pucSrc  = ptOriginPic->aucPixelDatas + dwSrcY*ptOriginPic->iLineBytes;//每條橫線上有dwDstWidth個點要保存for (x = 0; x <dwDstWidth; x++){//結合pdwSrcXTable數組找出要保存的點memcpy(pucDest+x*dwPixelBytes, pucSrc+pdwSrcXTable[x]*dwPixelBytes, dwPixelBytes);}}free(pdwSrcXTable);return 0;
}

?

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/384498.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/384498.shtml
英文地址,請注明出處:http://en.pswp.cn/news/384498.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數碼相框項目之顯示一張可放大、縮小、拖拽的圖片

之前我做過一個電子相框的項目&#xff0c;涉及到的重難點主要為&#xff1a;在LCD上放大、縮小、移動圖片。 首先我們得明白的一點是&#xff1a;無論是放大或縮小&#xff0c;實際上都是對原圖進行等比例的縮小&#xff0c;然后在LCD上面顯示&#xff0c;只不過縮小的程度不…

TCP協議-如何保證傳輸可靠性

TCP協議傳輸的特點主要就是面向字節流、傳輸可靠、面向連接。這篇博客&#xff0c;我們就重點討論一下TCP協議如何確保傳輸的可靠性的。 確保傳輸可靠性的方式 TCP協議保證數據傳輸可靠性的方式主要有&#xff1a; 校驗和序列號確認應答超時重傳連接管理流量控制擁塞控制 校…

TCP協議-握手與揮手

認識TCP協議 TCP全稱為“傳輸控制協議”&#xff0c;這是傳輸層的一個協議&#xff0c;對數據的傳輸進行一個詳細的控制。 特點&#xff1a; 面向字節流安全可靠面向連接 TCP協議段格式 源端口號與目的端口號&#xff1a;這里與UDP的一樣&#xff0c;每個數據都要知道從哪個…

ASOC注冊過程

一、什么是ASOC 在嵌入式系統里面的聲卡驅動為ASOC&#xff08;ALSA System on Chip&#xff09; &#xff0c;它是在ALSA 驅動程序上封裝的一層&#xff0c;分為3大部分&#xff0c;Machine&#xff0c;Platform和Codec ,三部分的關系如下圖所示&#xff1a;其中Machine是指我…

ASOC調用過程

上一篇文章我們將了嵌入式系統注冊聲卡的過程&#xff1a;https://blog.csdn.net/qq_37659294/article/details/104748747 這篇文章我們以打開一個聲卡的播放節點為例&#xff0c;講解一下在APP調用open時&#xff0c;最終會如何調用到硬件相關的函數。 在上一篇文章最后我們說…

編寫聲卡驅動(框架)

在前面兩篇文章中&#xff0c;我們分別講了嵌入式Linux系統聲卡注冊的過程和調用的過程&#xff1a; https://blog.csdn.net/qq_37659294/article/details/104748747 https://blog.csdn.net/qq_37659294/article/details/104802868 講了那么多&#xff0c;我們最終的目的無非…

聲卡學習筆記

分享幾篇關于韋東山聲卡驅動的學習筆記&#xff0c;作者寫得非常詳細。 ALSA驅動框架&#xff1a;https://blog.csdn.net/qingkongyeyue/article/details/52328991 ASoC驅動框架&#xff1a;https://blog.csdn.net/qingkongyeyue/article/details/52349120 ASoC驅動重要結構…

路由器、交換機、集線器的區別

https://blog.csdn.net/weibo1230123/article/details/82779040

$PATH環境變量的作用

echo $PATH 顯示當前PATH環境變量&#xff0c;該變量的值由一系列以冒號分隔的目錄名組成&#xff0c;如&#xff1a;/usr/local/bin:/bin:/usr/bin。(冒號:是路徑分隔符) 在執行一個程序的時候如果沒有PATH的話&#xff0c;就需要寫出路徑名&#xff08;絕對或者相對&#xf…

dmesg

https://blog.csdn.net/zm_21/article/details/31760569

進程上下文與中斷上下文的理解

一.什么是內核態和用戶態 內核態&#xff1a;在內核空間執行&#xff0c;通常是驅動程序&#xff0c;中斷相關程序&#xff0c;內核調度程序&#xff0c;內存管理及其操作程序。 用戶態&#xff1a;用戶程序運行空間。 二.什么是進程上下文與中斷上下文 1.進程上下文&#xf…

GDB調試教程:1小時玩轉Linux gdb命令

原文鏈接&#xff1a;http://c.biancheng.net/gdb/ GDB 入門教程 本教程以下面的代碼為例&#xff0c;在 Linux 系統下來講解 GBD 的調試流程&#xff1a; int main (void) {unsigned long long int n, sum;n 1;sum 0;while (n < 100){sum sum n;n n 1;}return 0; …

shell將命令執行的結果賦值給 變量

https://blog.csdn.net/lemontree1945/article/details/79126819/

Linux下shell腳本指定程序運行時長

https://www.cnblogs.com/yychuyu/p/12626798.html

vim編輯器如何刪除一行或者多行內容

http://blog.itpub.net/69955379/viewspace-2681334/

C++經典問題:如果對象A中有對象成員B,對象B沒有默認構造函數,那么對象A必須在初始化列表中初始化對象B?

對象成員特點總結&#xff1a; &#xff08;1&#xff09;實例化對象A時&#xff0c;如果對象A有對象成員B,那么先執行對象B的構造函數&#xff0c;再執行A的構造函數。 &#xff08;2&#xff09;如果對象A中有對象成員B,那么銷毀對象A時&#xff0c;先執行對象A的析構函數&…

JZ2440用U-Boot給Nand-Flash燒寫程序時報錯:NAND write: incorrect device type in bootloader ‘bootloader‘ is not

JZ2440開發板使用問題&#xff0c;U-Boot燒寫程序到Nand Flash時報錯&#xff1a;NAND write: incorrect device type in bootloader bootloader is not a number 這是因為分區名中u-boot&#xff0c;不是bootloader&#xff0c;而cmd_menu.c里用的是bootloader 可以執行&#…

韋東山銜接班——4.4_構建根文件系統之構建根文件系統

文章地址&#xff1a; https://blog.csdn.net/gongweidi/article/details/100086289?biz_id102&utm_term%E9%9F%A6%E4%B8%9C%E5%B1%B1%E8%A1%94%E6%8E%A5%E7%8F%AD&utm_mediumdistribute.pc_search_result.none-task-blog-2~blog~sobaiduweb~default-5-100086289&…

C++中const char *p和char const *p

const char *p;他的意思是p指向的目標空間的內容不可變化 例如定義char cA; p&c;則c的內容不可以變化.如cB;等一些企圖改變變量c的值的做法都不行. 然而p仍然是動態的,就是它還可以指向別的空間,被賦予新的地址值,只是被他指向的目標空間的內容不可變化,如上面的c值始終為A…

qt 分割字符串的兩種方法

https://blog.csdn.net/a724699769/article/details/62216435