目录

(一)读取图片

(二)绘制图片

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来进行图片的绘制与显示相关推荐

  1. 利用FFmpeg编码器将JPG图片进行H.264编码原理

    利用FFmpeg编码器将JPG图片进行H.264编码原理 文章目录 利用FFmpeg编码器将JPG图片进行H.264编码原理 整体的编码流程 将JPG或BMP编码为YUV 利用FFmpeg将YUV格式 ...

  2. HTML5怎么让图片和文字重叠,利用HTML5实现全屏图片文字过渡切换特效

    特效描述:利用HTML5实现 全屏图片 文字过渡 切换特效.利用HTML5实现全屏图片文字过渡切换特效 代码结构 1. 引入CSS 2. 引入JS 3. HTML代码  Masupitami Wal ...

  3. 利用python进行识别相似图片(二)

    前言 和网上各种首先你要有一个女朋友的系列一样,想进行人脸判断,首先要有脸, 只要能靠确定人脸的位置,那么进行两张人脸是否相似的操作便迎刃而解了. 所以本篇文章着重讲述如何利用openCV定位人脸. ...

  4. DL之CNN:利用卷积神经网络算法(2→2,基于Keras的API-Functional)利用MNIST(手写数字图片识别)数据集实现多分类预测

    DL之CNN:利用卷积神经网络算法(2→2,基于Keras的API-Functional)利用MNIST(手写数字图片识别)数据集实现多分类预测 目录 输出结果 设计思路 核心代码 输出结果 下边两张 ...

  5. DL之CNN:利用卷积神经网络算法(2→2,基于Keras的API-Sequential)利用MNIST(手写数字图片识别)数据集实现多分类预测

    DL之CNN:利用卷积神经网络算法(2→2,基于Keras的API-Sequential)利用MNIST(手写数字图片识别)数据集实现多分类预测 目录 输出结果 设计思路 核心代码 输出结果 1.10 ...

  6. ML之DR之PCA:利用PCA对手写数字图片识别数据集进行降维处理(理解PCA)

    ML之DR之PCA:利用PCA对手写数字图片识别数据集进行降维处理(理解PCA) 目录 初步理解PCA 输出结果 核心代码 初步理解PCA #理解PCA:线性相关矩阵秩计算样例 import nump ...

  7. Py之wxPython:利用wxPython设计GUI界面(图片背景+简单按钮)

    Py之wxPython:利用wxPython设计GUI界面(图片背景+简单按钮) 目录 实现界面 实现代码 实现界面 实现代码 import wxclass MyPanel(wx.Panel):def ...

  8. 如何简单地利用Bitmap为中介储存图片到数据库中

    这是我的第一篇博文,请大家多多指教!     大概一个月之前,在跟朋友合作开发一个APP的过程中,我们发现到一个问题:图片的存储.因为数据库没有图片这种数据类型,当用户上传的图片需要存储的时候,我们无 ...

  9. 好轮子收藏:一个支持几乎所有流行格式的图像加载库stb_image.h

    是在opengl教程网站上看到的,挺好用. stb_image.h一个非常流行的单头文件图像加载库,它能够加载大部分流行的文件格式,并且能够很简单得整合到你的工程之中. 下载地址:stb/stb_im ...

最新文章

  1. Ubuntu 关机,重启,注销命令
  2. 沈阳师范大学计算机题库,沈阳师范大学软件学院计算机学科专业基础综合历年考研真题汇编-20210607153358.docx-原创力文档...
  3. 【LSTM】基于LSTM网络的人脸识别算法的MATLAB仿真
  4. javafx 安装_JDK安装教程及环境配置
  5. boost::lambda模块实现右值测试
  6. tensorflow.python.framework.errors_impl.NotFoundError: libnvinfer.so.5: cannot open shared object fi
  7. 编码文件AndroidStudio初体验:解决Execution failed for task ':TestAndroid:compileDebug'.
  8. c#foreach循环_C#| 使用foreach循环打印整数数组
  9. web开发要学多久,HTML表格标签,薪资翻倍
  10. sf | 读取和保存空间矢量数据
  11. 年终总结系列6:借与贷,科普LTV指标
  12. 成长有三方面,其中最重要的是
  13. Spark操作Hive分区表
  14. 大数据处理系统关键层次架构
  15. java合并表的两行_如何通过SQL将不同数据库表中记录两行合并为一行
  16. 剑指offer 06-从尾到头打印链表
  17. Scott Page  斯科特佩奇《模型思维》读书笔记
  18. 安卓手机内外SD卡互换
  19. 多线程生产者消费者模型
  20. java监听器的原理_[转]Java监听器的原理与实现

热门文章

  1. 计算机谱子佛系少女,佛系少女简谱-冯提莫-听完仿佛整个人都变年轻了
  2. Carbon生成代码图片详细教程
  3. Chrome游览器Google商店下载crx文件
  4. C++如何定义一个函数指针
  5. 苹果报告问题_iPhone12,OLED屏缺陷引争议,苹果“正在调查”
  6. IAR右键无法跳转问题的两种解决方法
  7. linux io读写次数 oid,Linux系统监控的CPU、Mem、IO的OID
  8. Java class类文件和类加载器详解以及代码优化
  9. 服务器数据恢复-Windows服务器RAID5数据恢复案例
  10. (专升本)(Word、Excel行列最多是?)