首先说明 部分代码来自http://www.cnblogs.com/IamEasy_Man/archive/2009/12/14/1624023.html。至于里面的源地址什么的我不管。

然后吐槽,国内的资料各种坑爹,竟没有一个肯老老实实的把png加载与显示做完的,也许是太简单?模板测试我也没找到。这个例子是模板测试的前置工程而已。。。

再吐槽,百度搜到的某偏 windows下opengl秒加载png jpg什么什么就是CImage的那个,用了之后发现各种不靠谱 不靠谱 不靠谱。重要的事情说三遍,然后我只好老老实实去编译libpng,用libpng加载。

下面是代码实现

// OGLTtest.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"
#define GLEW_STATIC
#include <gl/glew.h>
#include <GLFW/glfw3.h>
#include <stdio.h>
#include <string>
#include "png.h"#pragma comment (lib,"opengl32.lib")
#pragma comment (lib,"glfw3.lib")
#pragma  comment(lib, "libpng16d.lib")class gl_texture_t{
public:GLsizei width;GLsizei height;GLenum format;GLint internalFormat;GLuint id;GLubyte *texels;
};
/* Texture id for the demo */
gl_texture_t *ReadPNGFromFile(const char *filename);
GLuint loadPNGTexture(const char *filename);
void GetPNGtextureInfo(int color_type, gl_texture_t *texinfo);using namespace std;unsigned int LoadTex(string Image)
{unsigned int Texture=0;FILE* img = NULL;fopen_s(&img,Image.c_str(), "rb");unsigned long bWidth = 0;unsigned long bHeight = 0;unsigned long  size = 0;fseek(img, 18, SEEK_SET);fread(&bWidth, 4, 1, img);fread(&bHeight, 4, 1, img);fseek(img, 0, SEEK_END);size = ftell(img) - 54;unsigned char *data = (unsigned char*)malloc(size);fseek(img, 54, SEEK_SET);    // image datafread(data, size, 1, img);fclose(img);unsigned int t2=0;glGenTextures(1, &Texture);glGenTextures(1, &t2);glBindTexture(GL_TEXTURE_2D, Texture);glTexImage2D(GL_TEXTURE_2D, 0,3, bWidth, bHeight, 0,GL_BGR_EXT, GL_UNSIGNED_BYTE, data);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);if (data)free(data);return Texture;
}int main(void)
{GLFWwindow* window;/* Initialize the library */if (!glfwInit())return -1;/* Create a windowed mode window and its OpenGL context */window = glfwCreateWindow(480, 640, "Hello World", NULL, NULL);if (!window){glfwTerminate();return -1;}/* Make the window's context current */glfwMakeContextCurrent(window);//unsigned int img = LoadTex("d:\\b0.bmp");unsigned int img = loadPNGTexture("d:\\test.png");unsigned int mask_img = LoadTex("d:\\mask.bmp");//unsigned int tid = ATLLoadTexture(L"d:\\b0.png");/* Loop until the user closes the window */while (!glfwWindowShouldClose(window)){glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);glClearColor(1.0, 1.0, 0.0, 0.5);glEnable(GL_BLEND);glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);//glEnable(GL_STENCIL_TEST);//glDepthMask(GL_FALSE);//根据掩码图设置模板缓冲区的值/*  glStencilFunc(GL_NEVER, 1, 1);glStencilOp(GL_REPLACE , GL_KEEP, GL_KEEP);glEnable(GL_TEXTURE_2D);glBindTexture(GL_TEXTURE_2D, mask_img);glBegin(GL_QUADS);glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);glTexCoord2f(1.0f, 0.0f); glVertex3f(1.0f, -1.0f, 1.0f);glTexCoord2f(1.0f, 1.0f); glVertex3f(1.0f, 1.0f, 1.0f);glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f);glEnd();glStencilFunc(GL_EQUAL, 1, 0xff);glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);*///glEnable(GL_ALPHA_TEST);//非必须//glAlphaFunc(GL_GREATER, 0.1);glEnable(GL_TEXTURE_2D);glBindTexture(GL_TEXTURE_2D, img);glBegin(GL_QUADS);glTexCoord2f(0.0f, 0.0f); glVertex3f(-0.5f, -0.5f, 1.0f);glTexCoord2f(1.0f, 0.0f); glVertex3f(.5f, -.5f, 1.0f);glTexCoord2f(1.0f, 1.0f); glVertex3f(0.5f, 0.5f, 1.0f);glTexCoord2f(0.0f, 1.0f); glVertex3f(-0.5f, 0.5f, 1.0f);glEnd();/* Swap front and back buffers */glfwSwapBuffers(window);/* Poll for and process events */glfwPollEvents();}glfwTerminate();return 0;
}//以下函数引用别人的。
gl_texture_t * ReadPNGFromFile(const char *filename)
{gl_texture_t *texinfo;png_byte magic[8];png_structp png_ptr;png_infop info_ptr;int bit_depth, color_type;FILE *fp = NULL;png_bytep *row_pointers = NULL;png_uint_32 w, h;int i;/* Open image file */fopen_s(&fp,filename, "rb");if (!fp){fprintf(stderr, "error: couldn't open \"%s\"!\n", filename);return NULL;}/* Read magic number */fread(magic, 1, sizeof(magic), fp);/* Check for valid magic number */if (!png_check_sig(magic, sizeof(magic))){fprintf(stderr, "error: \"%s\" is not a valid PNG image!\n", filename);fclose(fp);return NULL;}/* Create a png read struct */png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);if (!png_ptr){fclose(fp);return NULL;}/* Create a png info struct */info_ptr = png_create_info_struct(png_ptr);if (!info_ptr){fclose(fp);png_destroy_read_struct(&png_ptr, NULL, NULL);return NULL;}/* Create our OpenGL texture object */texinfo = (gl_texture_t *)malloc(sizeof(gl_texture_t));/* Initialize the setjmp for returning properly after a libpng error occured */if (setjmp(png_jmpbuf(png_ptr))){fclose(fp);png_destroy_read_struct(&png_ptr, &info_ptr, NULL);if (row_pointers) free(row_pointers);if (texinfo) {if (texinfo->texels)free(texinfo->texels);free(texinfo);}return NULL;}/* Setup libpng for using standard C fread() function with our FILE pointer */png_init_io(png_ptr, fp);/* Tell libpng that we have already read the magic number */png_set_sig_bytes(png_ptr, sizeof(magic));/* Read png info */png_read_info(png_ptr, info_ptr);/* Get some usefull information from header */bit_depth = png_get_bit_depth(png_ptr, info_ptr);color_type = png_get_color_type(png_ptr, info_ptr);/* Convert index color images to RGB images */if (color_type == PNG_COLOR_TYPE_PALETTE)png_set_palette_to_rgb(png_ptr);/* Convert 1-2-4 bits grayscale images to 8 bits grayscale. */if (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8)png_set_expand_gray_1_2_4_to_8(png_ptr);if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS))png_set_tRNS_to_alpha(png_ptr);if (bit_depth == 16) png_set_strip_16(png_ptr);else if (bit_depth < 8) png_set_packing(png_ptr);/* Update info structure to apply transformations */png_read_update_info(png_ptr, info_ptr);/* Retrieve updated information */png_get_IHDR(png_ptr, info_ptr, &w, &h, &bit_depth, &color_type, NULL, NULL, NULL);texinfo->width = w;texinfo->height = h;/* Get image format and components per pixel */GetPNGtextureInfo(color_type, texinfo);/* We can now allocate memory for storing pixel data */texinfo->texels = (GLubyte *)malloc(sizeof(GLubyte) * texinfo->width * texinfo->height * texinfo->internalFormat);/* Setup a pointer array. Each one points at the begening of a row. */row_pointers = (png_bytep *)malloc(sizeof(png_bytep) * texinfo->height);for (i = 0; i < texinfo->height; ++i){row_pointers[i] = (png_bytep)(texinfo->texels + ((texinfo->height - (i + 1)) * texinfo->width * texinfo->internalFormat));}/* Read pixel data using row pointers */png_read_image(png_ptr, row_pointers);/* Finish decompression and release memory */png_read_end(png_ptr, NULL);png_destroy_read_struct(&png_ptr, &info_ptr, NULL);/* We don't need row pointers anymore */free(row_pointers);fclose(fp);return texinfo;
}
GLuint loadPNGTexture(const char *filename)
{gl_texture_t *png_tex = NULL;GLuint tex_id = 0;GLint alignment;png_tex = ReadPNGFromFile(filename);if (png_tex && png_tex->texels){/* Generate texture */glGenTextures(1, &png_tex->id);glBindTexture(GL_TEXTURE_2D, png_tex->id);/* Setup some parameters for texture filters and mipmapping */glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);glGetIntegerv(GL_UNPACK_ALIGNMENT, &alignment);glPixelStorei(GL_UNPACK_ALIGNMENT, 1);glTexImage2D(GL_TEXTURE_2D, 0, png_tex->internalFormat, png_tex->width, png_tex->height, 0, png_tex->format, GL_UNSIGNED_BYTE, png_tex->texels);glPixelStorei(GL_UNPACK_ALIGNMENT, alignment);tex_id = png_tex->id;/* OpenGL has its own copy of texture data */free(png_tex->texels);free(png_tex);}return tex_id;
}void GetPNGtextureInfo(int color_type,  gl_texture_t *texinfo)
{switch (color_type){case PNG_COLOR_TYPE_GRAY:texinfo->format = GL_LUMINANCE;texinfo->internalFormat = 1;break;case PNG_COLOR_TYPE_GRAY_ALPHA:texinfo->format = GL_LUMINANCE_ALPHA;texinfo->internalFormat = 2;break;case PNG_COLOR_TYPE_RGB:texinfo->format = GL_RGB;texinfo->internalFormat = 3;break;case PNG_COLOR_TYPE_RGB_ALPHA:texinfo->format = GL_RGBA;texinfo->internalFormat = 4;break;default:/* Badness */break;}
}
//int _tmain(int argc, _TCHAR* argv[])
//{
//  return 0;
//}

loadTex忘了哪里copy过来的了,然后纠正一个 glTexImage2D别人的错误说明,

glTexImage2D可以加载任意分辨率的图片,当然不能超过ogl支持的最大纹理尺寸。不是什么256*256 什么2的XX次幂,什么偶数骑术。。全是误导人的好吗。

它的姊妹加载函数,会自动生成一个text chain 适应各种lod分辨率,简单测试我们就不要这么玩了。并不推荐它。

下来是图。。懒得排版了

不造glew用到没有,如果没有的童鞋,可以自行去掉。glfw自己去下吧。

opengl下png图片的加载与显示相关推荐

  1. [html] iOS下页面如何启动加载时显示画面图片?如何设置大小?它有什么好处?

    [html] iOS下页面如何启动加载时显示画面图片?如何设置大小?它有什么好处? <link rel="apple-touch-startup-image" href=&q ...

  2. echarts树图图标修改成图片以及自定义图片首次加载不显示的问题的修改<js>

    首先看一下显示效果,如下图所示: 1.首先修改图片,在option对象中加入 下方代码就可实现图片的修改,但是存在bug symbol:'image://https://ss2.bdstatic.co ...

  3. html加载完显示图片,js图片未加载完显示loading效果

    js图片未加载完显示loading效果 img{float:left;200px;height:200px;margin:0 10px 10px 0} //判断浏览器 var Browser=new ...

  4. 使用QT实现一个图像处理软件1 —— 图片的加载和显示

    为了实现图片的加载和显示,本文主要将使用到Qt中的几个类,分别是: QImage,这是Qt实现的一个存储图片信息的类,支持大部分的图片格式,支持像素操作,后续所有的图像处理算法都将在这个类的基础上进行 ...

  5. vue图片img加载失败显示自定义默认图片(缺省图)

    vue图片img加载失败显示自定义默认图片(缺省图) 1.图片加载示例  2.加载失败显示默认图片  3.加载失败默认图片代码处理 <div class="book-img" ...

  6. Vue环境下el-image图片动态加载失败问题

    <div v-for="(item,index) in list" :key="index"><el-image :src="ite ...

  7. OpenCV——图片的加载、显示、保存(python)

    本小节,我们将学习在Python语言中利用OpenCV库来实现图片的读取.显示.保存,所有的这些图片都是一个numpy.ndarray,这三种操作都过cv2.imread().cv2.imshow() ...

  8. element ui 图片加载失败_2.ElementUI之图片懒加载无法显示的问题,求教。

    在使用这个组件的时候,遇到了奇奇怪怪的Bug. 页面出来了,但图片的懒加载功能却没出来,没有实现官网给出的效果. 代码如下 这是gourmet world页面 11111 export default ...

  9. Android-Universal-Image-Loader 图片异步加载类库的使用(超详细配置)

    UIL( Android-Universal-Image-Loader 图片异步加载类库的使用(超详细配置)) http://blog.csdn.net/vipzjyno1/article/detai ...

最新文章

  1. ViewPager 入门一
  2. Spring-整合多个配置文件
  3. 关于VC单选按钮不能设置变量以及Group属性的设置问题
  4. CSharpGL(39)GLSL光照示例:鼠标拖动太阳(光源)观察平行光的漫反射和镜面反射效果...
  5. Python -bs4介绍
  6. Xshell 无法连接虚拟机中的ubuntu的问题
  7. c++中基类与派生类中隐含的this指针的分析
  8. 手写一个网关服务,理解更透彻!
  9. JAVA Reflection(反射机制)续
  10. spring思想分析
  11. Linux中Shell脚本教程学习
  12. Python笔记 :科赫雪花曲线(计算思维训练1)
  13. 越来越火的图数据库到底能做什么?
  14. XCode11上传ipa到AppStoreConnect
  15. 只有VOB 文件,怎样使用IfoEdit生成烧制DVD所需的IFO、BUP文件!
  16. java0.632数据类型_Object-c提供基本数据类型
  17. 玉米田 炮兵阵地 状态压缩DP
  18. C++:编程题:魔兽世界之一:备战
  19. Mysql组合索引使用和用法
  20. 机器人系统设计与制作:Python语言实现2.5 用Blender制作机器人的三维模型

热门文章

  1. JMeter测试工具使用基础教程
  2. 开源: EDSMap,e都市的Flex版本
  3. 都这么智能了,奥迪为什么连气味都处理不了?
  4. zabbix服务端和客户端的搭建
  5. Python爬虫笔记(1)--对新笔趣阁进行爬取
  6. 基于Unity3D的声音管理系统的实现
  7. 从零开始学习JavaScript:轻松掌握编程语言的核心技能①
  8. 【maven】help插件
  9. php旅行社网站源码在线支付,Thinkphp开发的旅行社网站系统
  10. linux根目录空间不足,追加空间到根目录下