zoukankan      html  css  js  c++  java
  • 简单易用的图像库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
    ", 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;
    }
    

      

  • 相关阅读:
    编译错误总结。
    9.7
    9.5
    9.6
    9.4
    9.3
    FutureTask取结果超时代码小测试
    java concurrent包常用类小结
    java Nio零散知识点整理
    java进阶教程unit_2java常用类(2)
  • 原文地址:https://www.cnblogs.com/kileyi/p/8000199.html
Copyright © 2011-2022 走看看