• 大小: 422KB
    文件类型: .zip
    金币: 2
    下载: 1 次
    发布日期: 2021-06-05
  • 语言: 其他
  • 标签: OpenGL  纹理  贴图  

资源简介

本程序为OpenGL纹理贴图小程序,图片格式为jpg。代码中如有疑问请指出,会为你一一解答。

资源截图

代码片段和文件信息

#include “jpegtools.h“

void DecodeJPG(jpeg_decompress_struct* cinfo JPGtexture *pImageData)
{
    GLint rowSpan;
    //读取JPEG文件头
    jpeg_read_header(cinfo TRUE);
    // 使用压缩信息开始解压缩
    jpeg_start_decompress(cinfo);
    // 读取图像大小、像素数据
    rowSpan = cinfo->image_width * cinfo->num_components;
    pImageData->width   = cinfo->image_width;
    pImageData->height   = cinfo->image_height;
    //为pImageData->data分配内存
    pImageData->texels = new GLubyte[rowSpan * pImageData->height];
    switch (cinfo->num_components)
    {
        case 1:
        {
                pImageData->internalFormat = 1;
                pImageData->format = GL_LUMINANCE;
                break;
        }
        case 2:
        {
                pImageData->internalFormat = 2;
                pImageData->format = GL_LUMINANCE_ALPHA;
                break;
        }
        case 3:
        {
                pImageData->internalFormat = 3;
                pImageData->format = GL_RGB;
                break;
        }
        case 4:
        {
                pImageData->internalFormat = 4;
                pImageData->format = GL_RGBA;
                break;
        }
        default:
            break;
    }
    //创建每一行数据的指针
    GLubyte ** rowPtr = new GLubyte *[pImageData->height];
    for (int i = 0; i < pImageData->height; i++)
        rowPtr[i] = &(pImageData->texels[(pImageData->height-1-i)*rowSpan]);
    //读取像素数据
    int rowsRead = 0;
    while (cinfo->output_scanline < cinfo->output_height)
    {
        rowsRead+=jpeg_read_scanlines(cinfo&rowPtr[rowsRead]
                                      cinfo->output_height-rowsRead);
    }
    // 释放临时使用的指针
    delete [] rowPtr;
    // 解压缩结束
    jpeg_finish_decompress(cinfo);
}

JPGtexture *ReadJPEGFromFile(const char *filename)
{
    struct jpeg_decompress_struct cinfo;
    JPGtexture *pImageData = NULL;       //存放JPEG数据
    FILE *pFile;
    //打开文件
    if((pFile = fopen(filename “rb“)) == NULL)
    {
        fprintf (stderr “error: couldn‘t open \“%s\“!\n“ filename);
        return NULL;
    }
    // 定义一个错误句柄
    jpeg_error_mgr jerr;
    //解压缩信息对象指向错误句柄
    cinfo.err = jpeg_std_error(&jerr);
    // 初始化解压缩对象
    jpeg_create_decompress(&cinfo);
    //指定数据源
    jpeg_stdio_src(&cinfo pFile);
    //分配内存,用于存放数据
    pImageData = (JPGtexture*)malloc(sizeof(JPGtexture));
    // 进行解压缩
    DecodeJPG(&cinfo pImageData);
    // 释放内存
    jpeg_destroy_decompress(&cinfo);
    fclose(pFile);
    // 返回已经解压缩后的数据
    return pImageData;
}

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2018-04-14 13:16  JPEG_texture\
     文件      427514  2016-10-11 13:18  JPEG_texture\car.jpg
     文件         287  2016-10-10 13:58  JPEG_texture\Identity.fp
     文件         327  2016-10-10 13:57  JPEG_texture\Identity.vp
     文件        2756  2016-10-11 14:26  JPEG_texture\jpegtools.cpp
     文件         444  2016-10-11 14:24  JPEG_texture\jpegtools.h
     文件        5386  2016-10-11 14:20  JPEG_texture\main.cpp
     文件         307  2016-10-11 13:25  JPEG_texture\Rectangle.pro

评论

共有 条评论