OpenGL学习笔记(三)---FreeImage颜色显示错乱的解决方法

2024-04-16 15:18

本文主要是介绍OpenGL学习笔记(三)---FreeImage颜色显示错乱的解决方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、简介 

    看Nehe的教程学习OpenGL看到加载图片时用到了FreeImage,跟着写了下,发现图片颜色是错乱的。

如图:



调试的时候发现自己的少了一段代码:

	if ((imageType == FIT_BITMAP) && (FreeImage_GetBPP(pBitmap) == 24)){textureFormat = GL_RGBA;datatype = GL_UNSIGNED_BYTE;components = GL_RGBA;texturedata = (unsigned char*)malloc(nWidth*nHeight*4);int red, green, blue, alpha;
#ifdef	BIG_ENDIAN//! RGBA;red = 0; green = 1; blue = 2; alpha = 3;
#else//! BGRA;red = 2; green = 1; blue = 0; alpha = 3;
#endifint offset = 0;int offset_img = 0;for (unsigned int y = 0; y < nHeight; y++){for (unsigned int x = 0; x < nWidth; x++){texturedata[offset+red] = ((unsigned char*)bits)[offset_img+0];texturedata[offset+green] = ((unsigned char*)bits)[offset_img+1];texturedata[offset+blue] = ((unsigned char*)bits)[offset_img+2];texturedata[offset+alpha] = 0;offset += 4;offset_img += 3;}offset_img = y*nPitch;}}


其中BIG_ENDIAN是“大端模式”表示数据的读取方式从高地址到低地址;

原来BMP格式图片是按blue,green,red顺序存储的,而不是OpenGL常见的R,G,B顺序。


二、解决方法

1.读取数据的时候把数据按需要的方式读取,像NeHe处理代码类似.

2.不想那么麻烦可以,可以直接用OpenGL定义的转换方式转换,只需改一个参数:

(修改红色字体部分,第7个参数):
glTexImage2D(GL_TEXTURE_2D, level, internal_format, width, height,
border, GL_BGR_EXT, GL_UNSIGNED_BYTE, bits);//GL_RGB转 GL_BGR_EXT

效果如图:


这篇关于OpenGL学习笔记(三)---FreeImage颜色显示错乱的解决方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/909156

相关文章

使用Python和OpenCV库实现实时颜色识别系统

《使用Python和OpenCV库实现实时颜色识别系统》:本文主要介绍使用Python和OpenCV库实现的实时颜色识别系统,这个系统能够通过摄像头捕捉视频流,并在视频中指定区域内识别主要颜色(红... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间详解

qt5cored.dll报错怎么解决? 电脑qt5cored.dll文件丢失修复技巧

《qt5cored.dll报错怎么解决?电脑qt5cored.dll文件丢失修复技巧》在进行软件安装或运行程序时,有时会遇到由于找不到qt5core.dll,无法继续执行代码,这个问题可能是由于该文... 遇到qt5cored.dll文件错误时,可能会导致基于 Qt 开发的应用程序无法正常运行或启动。这种错

Python常用命令提示符使用方法详解

《Python常用命令提示符使用方法详解》在学习python的过程中,我们需要用到命令提示符(CMD)进行环境的配置,:本文主要介绍Python常用命令提示符使用方法的相关资料,文中通过代码介绍的... 目录一、python环境基础命令【Windows】1、检查Python是否安装2、 查看Python的安

OpenCV实现实时颜色检测的示例

《OpenCV实现实时颜色检测的示例》本文主要介绍了OpenCV实现实时颜色检测的示例,通过HSV色彩空间转换和色调范围判断实现红黄绿蓝颜色检测,包含视频捕捉、区域标记、颜色分析等功能,具有一定的参考... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间

苹果macOS 26 Tahoe主题功能大升级:可定制图标/高亮文本/文件夹颜色

《苹果macOS26Tahoe主题功能大升级:可定制图标/高亮文本/文件夹颜色》在整体系统设计方面,macOS26采用了全新的玻璃质感视觉风格,应用于Dock栏、应用图标以及桌面小部件等多个界面... 科技媒体 MACRumors 昨日(6 月 13 日)发布博文,报道称在 macOS 26 Tahoe 中

Maven 配置中的 <mirror>绕过 HTTP 阻断机制的方法

《Maven配置中的<mirror>绕过HTTP阻断机制的方法》:本文主要介绍Maven配置中的<mirror>绕过HTTP阻断机制的方法,本文给大家分享问题原因及解决方案,感兴趣的朋友一... 目录一、问题场景:升级 Maven 后构建失败二、解决方案:通过 <mirror> 配置覆盖默认行为1. 配置示

SpringBoot排查和解决JSON解析错误(400 Bad Request)的方法

《SpringBoot排查和解决JSON解析错误(400BadRequest)的方法》在开发SpringBootRESTfulAPI时,客户端与服务端的数据交互通常使用JSON格式,然而,JSON... 目录问题背景1. 问题描述2. 错误分析解决方案1. 手动重新输入jsON2. 使用工具清理JSON3.

使用jenv工具管理多个JDK版本的方法步骤

《使用jenv工具管理多个JDK版本的方法步骤》jenv是一个开源的Java环境管理工具,旨在帮助开发者在同一台机器上轻松管理和切换多个Java版本,:本文主要介绍使用jenv工具管理多个JD... 目录一、jenv到底是干啥的?二、jenv的核心功能(一)管理多个Java版本(二)支持插件扩展(三)环境隔

Java中Map.Entry()含义及方法使用代码

《Java中Map.Entry()含义及方法使用代码》:本文主要介绍Java中Map.Entry()含义及方法使用的相关资料,Map.Entry是Java中Map的静态内部接口,用于表示键值对,其... 目录前言 Map.Entry作用核心方法常见使用场景1. 遍历 Map 的所有键值对2. 直接修改 Ma

Mybatis Plus Join使用方法示例详解

《MybatisPlusJoin使用方法示例详解》:本文主要介绍MybatisPlusJoin使用方法示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,... 目录1、pom文件2、yaml配置文件3、分页插件4、示例代码:5、测试代码6、和PageHelper结合6