簡單易用的圖像庫stb_image


最近又回到了選擇圖像庫的老問題上,之前用過FreeImage,DevIL,libpng。

FreeImage的問題是他的Licence有點迷,雙證書,除了GPL還有個自己的沒讀懂,不商用的話隨便折騰,商業的話又不想麻煩讀他的文檔,我好懶......

DevIL用了UPX,呵呵!!直接Pass!!!

libpng用起來有點麻煩。

 

 

而最近看的許多開源似乎都在用stb_image這個庫,基本單文件就能使用,例子也簡單粗暴,Licence是public domain和MIT,MIT是啥玩意,逼乎如是說。

https://www.zhihu.com/question/25079718/answer/30025234

簡單來說,看起來就是你只要帶上人家的Licence,說明這是人家寫的庫你在用就行了。大家都Happy。

其他證書參考

http://www.ruanyifeng.com/blog/2011/05/how_to_choose_free_software_licenses.html

http://blog.csdn.net/chengkaizone/article/details/51504239

 

下載

https://github.com/nothings/stb

 

再來看例子,目前一般主流的圖像格式也就是bmp,jpg,png,tga,dds,除了DDS一般是給DX用的,雖然一堆OpenGL程序也有用的,但是我一般只用png和tga,

png不用說了,帶alpha通道,tga就是4通道信息,如果你想3通道存顏色,4通道不存透明而是別的什么信息,又有編輯器如Photoshop支持的,tga就用得着,而png雖然

也能存alpha,但是編輯器不支持Alpha單獨編輯那種詭異玩法就不行了。然爾一般也就png。所以來吃狗!!!

簡單的寫個,讀寫png的例子,精簡自自帶例子,(0,0)是左上角像素

 1 #include <stdio.h>
 2 
 3 #define STB_IMAGE_WRITE_IMPLEMENTATION
 4 #include "stb_image_write.h"
 5 
 6 #define STB_IMAGE_IMPLEMENTATION
 7 #include "stb_image.h"
 8 
 9 int main(int argc, char** argv)
10 {
11     int w, h, n;
12 
13     //rgba
14     //load image
15     unsigned char *data = stbi_load("rgba.png", &w, &h, &n, 0);
16 
17     printf("%d, %d, %d\n", w, h, n);
18 
19     //change pixel
20 
21     //rgba,write 10 red pixel at line 11
22     for (int dx = 0; dx < 10; ++dx)
23     {
24         data[n * w * 10 + dx * n + 0] = 255;
25         data[n * w * 10 + dx * n + 1] = 0;
26         data[n * w * 10 + dx * n + 2] = 0;
27         data[n * w * 10 + dx * n + 3] = 255;
28     }
29     
30 
31     //write image
32     stbi_write_png("write.png", w, h, n, data, w * n);
33 
34     stbi_image_free(data);
35 
36 
37     return 0;
38 }

 

 

 

效果讀取一張圖,並在第11行寫入10像素紅色,再保存到文件。

 

 

 

內存讀取圖像方法

 

void load_mem()
{
	FILE* inFile = fopen("rgba.png", "rb");

	fseek(inFile, 0, SEEK_END);
	unsigned int bufSize = ftell(inFile);
	fseek(inFile, 0, SEEK_SET);

	unsigned char* buf = new unsigned char[bufSize];
	fread(buf, bufSize, 1, inFile);

	fclose(inFile);

	int w = 128;
	int h = 128;
	int n = 4;
	

	unsigned char *rgba = stbi_load_from_memory(buf, bufSize, &w, &h, &n, 0);

	stbi_write_png("test_from_memory.png", w, h, n, rgba, w * n);

	stbi_image_free(rgba);

	delete[] buf;
}

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM