A2-1 利用stb_image.h来进行图片的绘制与显示
目录
(一)读取图片
(二)绘制图片
TIP1:Debug:
(三)stb_image.h库下载与使用
使用教程:
TIP2:gittee源代码
如有问题请就指出,谢谢!
stb_image 是一个简单易用的图像解码库。这里我们采用图形库stb_image.h来读取图片。
思路:
(1)从计算机通过stb_image库函数读入一张图片,并将信息封装在Image类中。
(2)将读入的图片绘制在画布上。 Canvas::drawImage(int _x,int _y, Image _image);
(一)读取图片
首先我们想象一下这个流程,将一张图片读入,需要对图片的信息进行采集(长度,宽度,色彩信息)采集过后就要进行存储与应用。不妨我们设置一个Image类,专门用于对待绘制图片的信息管理。
(1)成员变量:长度,宽度,色彩信息。并设置函数进行进行获取信息:这里只是读操作无法进行存储。
(2)构造函数与析构函数: 颜色信息初始化时就要有存储。
(3)创建图片内存:不仅要读还要写!这里是写操作。首先创建一个RGBA类型的像素数组m_data,再把读入的信息拷贝到m_data中。
(4)工具函数:static Image* readFromFile(const char* _fileName);这个工具函数。
将图片正过来;加载图片;构造一张图片;释放内存,返回指向图片的指针。
图片路径:建议工程文件夹下在新建一个res文件夹专供资源导入使用,例:"res/x.png"
//Image.cpp中实现
Image* Image::readFromFile(const char* _fileName){int _picType=0 ;int _width= 0;int _height=0 ;stbi_set_flip_vertically_on_load(true);byte* bits = stbi_load(_fileName, &_width, &_height, &_picType, STBI_rgb_alpha);//通过名字读取图片Image* _image = new Image(_width, _height, bits);//构造一个Imagestbi_image_free(bits);return _image;}
//Image.h中实现class Image{private:int m_width;int m_height;RGBA* m_data;public:int GetWidth()const{return m_width;}int GetHeight()const{return m_height;}RGBA GetColor(int x, int y){if (x > m_width - 1 || y > m_height - 1 || y < 0 || x < 0)return RGBA(0, 0, 0, 0);return m_data[y * m_width + x];}Image(int _width=0, int _height=0, byte* _data= nullptr)//设置缺省值{m_width = _width;m_height = _height;if (_data){m_data = new RGBA[m_width * m_height];//创建内存memcpy(m_data, _data, sizeof(RGBA) * m_height * m_width);//目标,源头,大小}} //封装信息~Image() {if (m_data){delete[]m_data;}}//工具函数static Image* readFromFile(const char* _fileName);};
检验图片是否导入:通过打断的方式:
(二)绘制图片
而对一张图片进行绘制,我们是要将读取的信息重新画在画布上。在画布上绘制图片我们可以新建一个绘制图片的方法。如我们之前画三角形,画点,线,都是采用在画布中定义了一个方法,这些方法就如同我们画画使用的笔刷一样,想画什么类就新建一个什么笔刷。
(1)获取绘制待绘制图片的信息,长度,宽度,颜色
(2) 选取画布上绘制图片的其实像素点。
//Canvas.cpp里实现
void Canvas::drawImage(int _x, int _y, Image* _image)//这可以看成是个图片的笔刷方法{for (int u = 0; u < _image->GetWidth(); u ++)//获取待绘制图片总的宽度{ for (int v = 0; v < _image->GetHeight(); v++) {RGBA _color = _image->GetColor(u, v); //获取待绘制图片的颜色信息drawPoint(_x + u, _y + v,_color); //将颜色信息绘制到画布上}}}
但这不是我们预期的结果。
计算机存储以bgra方式,但是在图片加载函数中设置的读取方式是rgba,我们需要把b和r
byte* bits = stbi_load(_fileName, &_width, &_height, &_picType, STBI_rgb_alpha);//RGBA读取方式//但是计算机以RGBA方式存储for (int i = 0; i < _width * _height * 4; i += 4){ 栅格数*字节byte tmp = bits[i];bits[i] = bits[i + 2];bits[i + 2] = tmp;}
TIP1:Debug:
1.类的交叉引用会导致,头文件的重复和包含。比如出现类成员未声明标识,在*缺少;等等的错误。2:提示以下原则:类.cpp文件包含.h文件。与别的类交叉引用分清先后调用关系,按先后顺序写头文件。3.另外出现bug,也要试着在编译器角度去理解,这是解决问题效率最高办法为何没声明标识?可能跳过了,或者是声明顺序问题。
(三)stb_image.h库下载与使用
stb_image.h库github下载地址:
stb_image.h:https://.com/nothings/stb/blob/master/stb_image.h
使用教程:
图像库:stb_image.h_YDDUONG的博客-CSDN博客图像库:stb_image.h:https://github.com/nothings/stb/blob/master/stb_image.h下载这一个头文件,将它以stb_image.h的名字加入你的工程,并另创建一个新的C++文件,输入以下代码:#define STB_IMAGE_IMPLEMENTATION#include "stb_image.h"通过定义STB_IMAGE_IMPLEMENTATION,预处理器会修改头文件,让其只包含相关的函数定义源码,等于是将这个头文件变为一个 .cphttps://blog.csdn.net/y_dd6011/article/details/116703348?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165068587116782092947011%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=165068587116782092947011&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-4-116703348.142^v9^control,157^v4^control&utm_term=stb.image&spm=1018.2226.3001.4187
TIP2:gittee源代码
第二章:图片/1.图片的读取和导入 · 刘敬一如/C++_exersize - Gitee.comhttps://gitee.com/liu-jingyiru/c--exersize/blob/master/%E7%AC%AC%E4%BA%8C%E7%AB%A0%EF%BC%9A%E5%9B%BE%E7%89%87/1.%E5%9B%BE%E7%89%87%E7%9A%84%E8%AF%BB%E5%8F%96%E5%92%8C%E5%AF%BC%E5%85%A5
如有问题请就指出,非常感谢!
A2-1 利用stb_image.h来进行图片的绘制与显示相关推荐
- 利用FFmpeg编码器将JPG图片进行H.264编码原理
利用FFmpeg编码器将JPG图片进行H.264编码原理 文章目录 利用FFmpeg编码器将JPG图片进行H.264编码原理 整体的编码流程 将JPG或BMP编码为YUV 利用FFmpeg将YUV格式 ...
- HTML5怎么让图片和文字重叠,利用HTML5实现全屏图片文字过渡切换特效
特效描述:利用HTML5实现 全屏图片 文字过渡 切换特效.利用HTML5实现全屏图片文字过渡切换特效 代码结构 1. 引入CSS 2. 引入JS 3. HTML代码 Masupitami Wal ...
- 利用python进行识别相似图片(二)
前言 和网上各种首先你要有一个女朋友的系列一样,想进行人脸判断,首先要有脸, 只要能靠确定人脸的位置,那么进行两张人脸是否相似的操作便迎刃而解了. 所以本篇文章着重讲述如何利用openCV定位人脸. ...
- DL之CNN:利用卷积神经网络算法(2→2,基于Keras的API-Functional)利用MNIST(手写数字图片识别)数据集实现多分类预测
DL之CNN:利用卷积神经网络算法(2→2,基于Keras的API-Functional)利用MNIST(手写数字图片识别)数据集实现多分类预测 目录 输出结果 设计思路 核心代码 输出结果 下边两张 ...
- DL之CNN:利用卷积神经网络算法(2→2,基于Keras的API-Sequential)利用MNIST(手写数字图片识别)数据集实现多分类预测
DL之CNN:利用卷积神经网络算法(2→2,基于Keras的API-Sequential)利用MNIST(手写数字图片识别)数据集实现多分类预测 目录 输出结果 设计思路 核心代码 输出结果 1.10 ...
- ML之DR之PCA:利用PCA对手写数字图片识别数据集进行降维处理(理解PCA)
ML之DR之PCA:利用PCA对手写数字图片识别数据集进行降维处理(理解PCA) 目录 初步理解PCA 输出结果 核心代码 初步理解PCA #理解PCA:线性相关矩阵秩计算样例 import nump ...
- Py之wxPython:利用wxPython设计GUI界面(图片背景+简单按钮)
Py之wxPython:利用wxPython设计GUI界面(图片背景+简单按钮) 目录 实现界面 实现代码 实现界面 实现代码 import wxclass MyPanel(wx.Panel):def ...
- 如何简单地利用Bitmap为中介储存图片到数据库中
这是我的第一篇博文,请大家多多指教! 大概一个月之前,在跟朋友合作开发一个APP的过程中,我们发现到一个问题:图片的存储.因为数据库没有图片这种数据类型,当用户上传的图片需要存储的时候,我们无 ...
- 好轮子收藏:一个支持几乎所有流行格式的图像加载库stb_image.h
是在opengl教程网站上看到的,挺好用. stb_image.h一个非常流行的单头文件图像加载库,它能够加载大部分流行的文件格式,并且能够很简单得整合到你的工程之中. 下载地址:stb/stb_im ...
最新文章
- Ubuntu 关机,重启,注销命令
- 沈阳师范大学计算机题库,沈阳师范大学软件学院计算机学科专业基础综合历年考研真题汇编-20210607153358.docx-原创力文档...
- 【LSTM】基于LSTM网络的人脸识别算法的MATLAB仿真
- javafx 安装_JDK安装教程及环境配置
- boost::lambda模块实现右值测试
- tensorflow.python.framework.errors_impl.NotFoundError: libnvinfer.so.5: cannot open shared object fi
- 编码文件AndroidStudio初体验:解决Execution failed for task ':TestAndroid:compileDebug'.
- c#foreach循环_C#| 使用foreach循环打印整数数组
- web开发要学多久,HTML表格标签,薪资翻倍
- sf | 读取和保存空间矢量数据
- 年终总结系列6:借与贷,科普LTV指标
- 成长有三方面,其中最重要的是
- Spark操作Hive分区表
- 大数据处理系统关键层次架构
- java合并表的两行_如何通过SQL将不同数据库表中记录两行合并为一行
- 剑指offer 06-从尾到头打印链表
- Scott Page 斯科特佩奇《模型思维》读书笔记
- 安卓手机内外SD卡互换
- 多线程生产者消费者模型
- java监听器的原理_[转]Java监听器的原理与实现
热门文章
- 计算机谱子佛系少女,佛系少女简谱-冯提莫-听完仿佛整个人都变年轻了
- Carbon生成代码图片详细教程
- Chrome游览器Google商店下载crx文件
- C++如何定义一个函数指针
- 苹果报告问题_iPhone12,OLED屏缺陷引争议,苹果“正在调查”
- IAR右键无法跳转问题的两种解决方法
- linux io读写次数 oid,Linux系统监控的CPU、Mem、IO的OID
- Java class类文件和类加载器详解以及代码优化
- 服务器数据恢复-Windows服务器RAID5数据恢复案例
- (专升本)(Word、Excel行列最多是?)