最近又回到了选择图像库的老问题上,之前用过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)是左上角像素

 #include <stdio.h>

 #define STB_IMAGE_WRITE_IMPLEMENTATION
#include "stb_image_write.h" #define STB_IMAGE_IMPLEMENTATION
#include "stb_image.h" int main(int argc, char** argv)
{
int w, h, n; //rgba
//load image
unsigned char *data = stbi_load("rgba.png", &w, &h, &n, ); printf("%d, %d, %d\n", w, h, n); //change pixel //rgba,write 10 red pixel at line 11
for (int dx = ; dx < ; ++dx)
{
data[n * w * + dx * n + ] = ;
data[n * w * + dx * n + ] = ;
data[n * w * + dx * n + ] = ;
data[n * w * + dx * n + ] = ;
} //write image
stbi_write_png("write.png", w, h, n, data, w * n); stbi_image_free(data); return ;
}

效果读取一张图,并在第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;
}

  

简单易用的图像库stb_image的更多相关文章

  1. 简单易用的图像解码库介绍 —— stb_image

    原文链接:简单易用的图像解码库介绍 -- stb_image 说到图像解码库,最容易想起的就是 libpng 和 libjpeg 这两个老牌图像解码库了. libpng 和 libjpeg 分别各自对 ...

  2. FineBI:一个简单易用的自助BI工具

    过去,有关企业数据分析的重担都压在IT部门,传统BI分析更多面向的是具有IT背景的人员.但随着业务分析需求的增加,很多公司都希望为业务用户提供自助分析服务,将分析工作落实到业务人员手中.但同时,分析工 ...

  3. DataAccess通用数据库访问类,简单易用,功能强悍

    以下是我编写的DataAccess通用数据库访问类,简单易用,支持:内联式创建多个参数.支持多事务提交.支持参数复用.支持更换数据库类型,希望能帮到大家,若需支持查出来后转换成实体,可以自行扩展dat ...

  4. 快速上手seajs——简单易用Seajs

    快速上手seajs——简单易用Seajs   原文  http://www.cnblogs.com/xjchenhao/p/4021775.html 主题 SeaJS 简易手册 http://yslo ...

  5. [.net 面向对象程序设计进阶] (22) 团队开发利器(一)简单易用的代码管理工具VSS

    [.net 面向对象程序设计进阶] (22) 团队开发利器(一)简单易用的代码管理工具VSS 本篇要点:在进阶篇快要结束的时候说说源代码管理器,我们的开发,不是一个人可以完成的事,团队协作很重要,而且 ...

  6. 设计与开发一款简单易用的Web报表工具(支持常用关系数据及hadoop、hbase等)

    EasyReport是一个简单易用的Web报表工具(支持Hadoop,HBase及各种关系型数据库),它的主要功能是把SQL语句查询出的行列结构转换成HTML表格(Table),并支持表格的跨行(Ro ...

  7. 分享一个简单易用的RPC开源项目—Tatala

    http://zijan.iteye.com/blog/2041894 这个项目最早(2008年)是用于一个网络游戏的Cache Server,以及一个电子商务的Web Session服务.后来不断增 ...

  8. ZOOM - 简单易用的 jQuery 照片相册插件

    jQuery 最令人印象深刻的应用之一就是对图片的处理,它可以让帮助你在你的项目中加入一些让人惊叹的图片切换效果.ZOOM 是一款全屏效果的 jQuery 图片切换展示插件,支持键盘前后按键切换,支持 ...

  9. BasicModal - 简单易用的现代 Web App 弹窗

    BasicModal 是为现代 Web 应用程序打造的弹窗系统.它包括所有你需要显示的信息,问题或接收用户的输入.这里的弹窗还可以链接起来,所以你可以很容易地建立一个预定义顺序的安装帮助或显示对话框. ...

随机推荐

  1. springBoot 整合mybaits 逆向工程

    pom.xml文件中增加配置项 <build> <plugins> <plugin> <groupId>org.springframework.boot ...

  2. Nginx、HAProxy、LVS三者的优缺点

    一.Nginx优点: 1.工作在网络7层之上,可针对http应用做一些分流的策略,如针对域名.目录结构,它的正规规则比HAProxy更为强大和灵活,所以,目前为止广泛流行. 2.Nginx对网络稳定性 ...

  3. python网页爬虫开发之六-Selenium使用

    chromedriver禁用图片,禁用js,切换UA selenium 模拟chrome浏览器,此时就是一个真实的浏览器,一个浏览器该加载的该渲染的它都加载都渲染,所以爬取网页的速度很慢.如果可以不加 ...

  4. day28元类与异常查找

    元类与异常处理1. 什么是异常处理    异常是错误发生的信号,一旦程序出错就会产生一个异常,如果该异常    没有被应用程序处理,那么该异常就会抛出来,程序的执行也随之终止    异常包含三个部分: ...

  5. java的环境配置

    java的安装 1,进入官网  https://www.oracle.com/index.html 2.Menu -> Downloads -> java ->  all Java ...

  6. git 第一次提交代码

    git init git add README.md git commit -m "first commit" git remote add origin https://git. ...

  7. tesseract_vs2015工具包使用

    在vs中配置tesseract4.0: 新建一个空的控制台程序.并找到下图位置 双击.x64.user出现如下图: 单击VC++目录,将tesseract-2015/include/tesseract ...

  8. 【浅说】堆(heap)和栈(stack)区别

    在了解堆与栈之前,我们想来了解下程序的内存分配 一个编译的程序占用的内存分为以下几个部分  :  1.栈区(stack)—   由编译器自动分配释放   ,存放函数的参数值,局部变量的值等.其操作方式 ...

  9. 学习node.js 第1篇 介绍nodejs

    Node.js是什么? Node.js是建立在谷歌Chrome的JavaScript引擎(V8引擎)的Web应用程序框架. 它的最新版本是:v0.12.7(在编写本教程时的版本).Node.js在官方 ...

  10. 数据库设计,表与表的关系,一对多。One-To-Many(2)

    一对多:主键数据表中只能包含一个记录,而在其关系记录表中这条记录可以与一个或多个记录相关,也可以没有记录与之相关. 关联映射:一对多/多对一存在最普遍的映射关系,简单来讲就如球员与球队的关系:一对多: ...