引言
前文說到,基于Alios系統的門禁只能處理JPG圖片,由于歷史遺留問題,服務器下發的人臉中有png格式的圖片,開發人員需要將png圖片進行解碼處理成RGBA格式的圖片,用于人臉識別,網上用的最多圖片處理庫為libjpg和libpng這些圖片處理庫過于復雜且移植后會擴大程式的大小,因此一款輕量級的png圖片處理庫的需求日益強烈,
lodepng介紹
LodePNG是一個集合了PNG影像解碼器和編碼器的代碼檔案,不依賴于諸如zlib和libpng的外部鏈接/庫,提供方便友好的PNG編解碼器呼叫方法,LodePNG主要是采用C(ISO C90)撰寫的,并提供了C++的介面,LodePNG的使用非常簡單,只要在專案檔案中包含lodepng.cpp和lodepng.h或者lodepng.c和lodepng.h就可以,
下載方式
1、登錄官網http://lodev.org/lodepng/進行下載,并且官方給出的有例子便于學習,

2、登錄github搜索lodepng,找到star最多的那一個就是,可以用git軟體進行下載,
使用方法
在此給出自己寫的一個例子供參考,應用時很簡單,lodepng庫提供的有直接讀入檔案的介面,lodepng_decode32_file() 這個介面可以直接將圖片讀入,并生成RGBA的格式影像,將其保存為RAW格式,可以使用imageJ軟體進行查看,
#include <stdio.h>
#include "lodepng.h"
//#define filename "E:\\sun.png"/>
解碼后圖片

本人是在Alios系統下進行開發,在此系統下沒有fopen等函式,需要根據alios的檔案說明將fopen函式改為aos_open函式,對win下的lodepng庫進行改寫,經過驗證可以在alios系統下使用,
static long lodepng_filesize(const char* filename) {
#ifdef WIN32 //Added by sun
FILE* file;
long size;
file = fopen(filename, "rb");
if(!file) return -1;
if(fseek(file, 0, SEEK_END) != 0) {
fclose(file);
return -1;
}
size = ftell(file);
/* It may give LONG_MAX as directory size, this is invalid for us. */
if(size == LONG_MAX) size = -1;
fclose(file);
#else
int file = -1;
int ret = -1;
struct aos_stat file_st;
long size;
file = aos_open(filename, O_RDWR);
if (file < 0) {
return -1;
}
/*
if(aos_lseek(file, 0, SEEK_END) != 0) {
aos_close(file);
return -1;
}
*/
ret = aos_stat(filename, &file_st);
if (!ret) {
size = file_st.st_size;
}
#endif
return size;
}
踩坑記錄
說到這里又讓我感覺到了嵌入式的特點,太需要經驗了,總體來看其實就是移植一個庫,移植過來呼叫呼叫就行了,但還是出現了很多問題,比如解碼一張這樣的圖片

結果卻是這樣,只能大概判斷出是錯位了,想了好久準備使用16進制檔案讀取軟體,如Hex Editor Neo來讀取,

經過讀取終于發現了問題,正確的RGBA是這樣的
但是轉換出來的卻是這樣的,可以發現有明顯的錯位,當時我還沒意識到錯誤在哪,技術領導看后說怎么多了換行符0d,0a,我這才發現問題,在網上進行搜索發現,fwrite實際寫入檔案的資料大小比引數指定的數值大一些位元組,原因是:win下用文本方式讀寫檔案,會在0A(換行)前加0D(回車),發現自己用的fp = fopen(“E:\face\19_32.raw”,“w”);用的W引數進行打開的,w引數是以文本的方式打開,將w引數改為wb就可以了,一切都正常了,開始沒有想到這個問題,我說為啥有的圖片轉換正常,有的不正常,原來是圖片中出現0a的話會被添上0d,導致錯誤,如果圖片中沒有oa則正常,錯誤解決,

總結
通過這個任務學會了嵌入式系統中圖片的處理,RGBA格式圖片的buffer大小長寬4,png圖片的大小不是,是因為png對圖片進行了壓縮,RGBA格式沒有壓縮,此外還學到了圖片的位深,C語言IO函式,如fopen,fclose等知識以及如何申請記憶體等相關知識,此外任何一個任務都不能小看,比如這次任務看著簡單,但是不做一遍根本不知道會產生什么問題,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/291717.html
標籤:其他
