BMP图像读取数据

2023-11-20

我们在使用Windows的画图软件,画一张图,然后保存成24位位图BMP图像后,要对这幅图像进行一系列的格式转换之前,需要先将BMP里的数据提取出来,然后再保存成BGR888的图像。

有两处细节要注意:

第一,我们直接保存成BMP图片,不知道为什么读取BMP信息很多字段为0,所以我们要自己手动设置;

第二,读取出的数据我们以为是bgr格式存放的,其实不对,其实是grb存放的,虽然我也不知道为什么会这样。

chenLeeCV.c

#include "chenLeeCV.h"
#include <stdio.h>
#include <stdlib.h>
 
ClImage* clLoadImage(char* path)
{
	ClImage* bmpImg;
	FILE* pFile;
	unsigned short fileType;
	ClBitMapFileHeader bmpFileHeader;
	ClBitMapInfoHeader bmpInfoHeader;
	int channels = 1;
	int width = 0;
	int height = 0;
	int step = 0;
	int offset = 0;
	unsigned char pixVal;
	ClRgbQuad* quad;
	int i, j, k;
 
	bmpImg = (ClImage*)malloc(sizeof(ClImage));
	pFile = fopen(path, "rb");
	if (!pFile)
	{
		free(bmpImg);
		return NULL;
	}
 
	fread(&fileType, sizeof(unsigned short), 1, pFile);
	if (fileType == 0x4D42)
	{
		printf("bmp file! \n");
 
		fread(&bmpFileHeader, sizeof(ClBitMapFileHeader), 1, pFile);
		printf("==============================================\n");
		printf("bmp:\n");
		printf("bmpFileHeader.bfSize:%d \n", bmpFileHeader.bfSize);
		printf("bmpFileHeader.bfReserved1:%d \n", bmpFileHeader.bfReserved1);
		printf("bmpFileHeader.bfReserved2:%d \n", bmpFileHeader.bfReserved2);
		printf("bmpFileHeader.bfOffBits:%d \n", bmpFileHeader.bfOffBits);
//		printf("bmp文件头信息:\n");
//		printf("文件大小:%d \n", bmpFileHeader.bfSize);
//		printf("保留字:%d \n", bmpFileHeader.bfReserved1);
//		printf("保留字:%d \n", bmpFileHeader.bfReserved2);
//		printf("位图数据偏移字节数:%d \n", bmpFileHeader.bfOffBits);
 
		fread(&bmpInfoHeader, sizeof(ClBitMapInfoHeader), 1, pFile);
		printf("==============================================\n");
		printf("bmp\n");
		printf("bmpInfoHeader.biSize:%d \n", bmpInfoHeader.biSize);
		printf("bmpInfoHeader.biWidth:%d \n", bmpInfoHeader.biWidth);
		printf("bmpInfoHeader.biHeight:%d \n", bmpInfoHeader.biHeight);
		printf("bmpInfoHeader.biPlanes:%d \n", bmpInfoHeader.biPlanes);
		printf("bmpInfoHeader.biBitCount:%d \n", bmpInfoHeader.biBitCount);
		printf("bmpInfoHeader.biCompression:%d \n", bmpInfoHeader.biCompression);
		printf("bmpInfoHeader.biSizeImage:%d \n", bmpInfoHeader.biSizeImage);
		printf("bmpInfoHeader.biXPelsPerMeter:%d \n", bmpInfoHeader.biXPelsPerMeter);
		printf("bmpInfoHeader.biYPelsPerMeter:%d \n", bmpInfoHeader.biYPelsPerMeter);
		printf("bmpInfoHeader.biClrUsed:%d \n", bmpInfoHeader.biClrUsed);
		printf("bmpInfoHeader.biClrImportant:%d \n", bmpInfoHeader.biClrImportant);
//		printf("bmp文件信息头\n");
//		printf("结构体长度:%d \n", bmpInfoHeader.biSize);
//		printf("位图宽度:%d \n", bmpInfoHeader.biWidth);
//		printf("位图高度:%d \n", bmpInfoHeader.biHeight);
//		printf("位图平面数:%d \n", bmpInfoHeader.biPlanes);
//		printf("颜色位数:%d \n", bmpInfoHeader.biBitCount);
//		printf("压缩方式:%d \n", bmpInfoHeader.biCompression);
//		printf("实际位图数据占用的字节数:%d \n", bmpInfoHeader.biSizeImage);
//		printf("X方向分辨率:%d \n", bmpInfoHeader.biXPelsPerMeter);
//		printf("Y方向分辨率:%d \n", bmpInfoHeader.biYPelsPerMeter);
//		printf("使用的颜色数:%d \n", bmpInfoHeader.biClrUsed);
//		printf("重要颜色数:%d \n", bmpInfoHeader.biClrImportant);
		printf("==============================================\n");

//      不知道为什么这里读出来的数值是0,所以只能手动设置为24
		bmpInfoHeader.biBitCount = 24;
 
		if (bmpInfoHeader.biBitCount == 8)
		{
			printf("8bit\n\n");
//			printf("该文件有调色板,即该位图为非真彩色\n\n");
			channels = 1;
			width = bmpInfoHeader.biWidth;
			height = bmpInfoHeader.biHeight;
			offset = (channels*width)%4;
			if (offset != 0)
			{
				offset = 4 - offset;
			}
			//bmpImg->mat = kzCreateMat(height, width, 1, 0);
			bmpImg->width = width;
			bmpImg->height = height;
			bmpImg->channels = 1;
			bmpImg->imageData = (unsigned char*)malloc(sizeof(unsigned char)*width*height);
			step = channels*width;
 
			quad = (ClRgbQuad*)malloc(sizeof(ClRgbQuad)*256);
			fread(quad, sizeof(ClRgbQuad), 256, pFile);
			free(quad);
 
			for (i=0; i<height; i++)
			{
				for (j=0; j<width; j++)
				{
					fread(&pixVal, sizeof(unsigned char), 1, pFile);
					bmpImg->imageData[(height-1-i)*step+j] = pixVal;
				}
				if (offset != 0)
				{
					for (j=0; j<offset; j++)
					{
						fread(&pixVal, sizeof(unsigned char), 1, pFile);
					}
				}
			}			
		}
		else if (bmpInfoHeader.biBitCount == 24)
		{
			printf("24bit\n\n");
//			printf("该位图为位真彩色\n\n");
			channels = 3;//channels也是需要手动设置,不知道为啥
//			width = bmpInfoHeader.biWidth;
//			height = bmpInfoHeader.biHeight;
			width = 1920;
			height = 1080;
 
			bmpImg->width = width;
			bmpImg->height = height;
			bmpImg->channels = 3;
			bmpImg->imageData = (unsigned char*)malloc(sizeof(unsigned char)*width*3*height);
			step = channels*width;
 
			offset = (channels*width)%4;
			if (offset != 0)
			{
				offset = 4 - offset;
			}
 
			for (i=0; i<height; i++)
			{
				for (j=0; j<width; j++)
				{
					for (k=0; k<3; k++)
					{
						fread(&pixVal, sizeof(unsigned char), 1, pFile);
						bmpImg->imageData[(height-1-i)*step+j*3+k] = pixVal;
					}
					//kzSetMat(bmpImg->mat, height-1-i, j, kzScalar(pixVal[0], pixVal[1], pixVal[2]));
				}
				if (offset != 0)
				{
					for (j=0; j<offset; j++)
					{
						fread(&pixVal, sizeof(unsigned char), 1, pFile);
					}
				}
			}
		}
	}
 
	return bmpImg;
}
 
#if 0
//这是保存数据为BMP的代码,未验证
bool clSaveImage(char* path, ClImage* bmpImg)
{
	FILE *pFile;
	unsigned short fileType;
	ClBitMapFileHeader bmpFileHeader;
	ClBitMapInfoHeader bmpInfoHeader;
	int step;
	int offset;
	unsigned char pixVal = '\0';
	int i, j;
	ClRgbQuad* quad;
 
	pFile = fopen(path, "wb");
	if (!pFile)
	{
		return false;
	}
 
	fileType = 0x4D42;
	fwrite(&fileType, sizeof(unsigned short), 1, pFile);
 
	if (bmpImg->channels == 3)//24位,通道,彩图
	{
		step = bmpImg->channels*bmpImg->width;
		offset = step%4;
		if (offset != 4)
		{
			step += 4-offset;
		}
 
		bmpFileHeader.bfSize = bmpImg->height*step + 54;
		bmpFileHeader.bfReserved1 = 0;
		bmpFileHeader.bfReserved2 = 0;
		bmpFileHeader.bfOffBits = 54;
		fwrite(&bmpFileHeader, sizeof(ClBitMapFileHeader), 1, pFile);
 
		bmpInfoHeader.biSize = 40;
		bmpInfoHeader.biWidth = bmpImg->width;
		bmpInfoHeader.biHeight = bmpImg->height;
		bmpInfoHeader.biPlanes = 1;
		bmpInfoHeader.biBitCount = 24;
		bmpInfoHeader.biCompression = 0;
		bmpInfoHeader.biSizeImage = bmpImg->height*step;
		bmpInfoHeader.biXPelsPerMeter = 0;
		bmpInfoHeader.biYPelsPerMeter = 0;
		bmpInfoHeader.biClrUsed = 0;
		bmpInfoHeader.biClrImportant = 0;
		fwrite(&bmpInfoHeader, sizeof(ClBitMapInfoHeader), 1, pFile);
 
		for (i=bmpImg->height-1; i>-1; i--)
		{
			for (j=0; j<bmpImg->width; j++)
			{
				pixVal = bmpImg->imageData[i*bmpImg->width*3+j*3];
				fwrite(&pixVal, sizeof(unsigned char), 1, pFile);
				pixVal = bmpImg->imageData[i*bmpImg->width*3+j*3+1];
				fwrite(&pixVal, sizeof(unsigned char), 1, pFile);
				pixVal = bmpImg->imageData[i*bmpImg->width*3+j*3+2];
				fwrite(&pixVal, sizeof(unsigned char), 1, pFile);
			}
			if (offset!=0)
			{
				for (j=0; j<offset; j++)
				{
					pixVal = 0;
					fwrite(&pixVal, sizeof(unsigned char), 1, pFile);
				}
			}
		}
	}
	else if (bmpImg->channels == 1)//8位,单通道,灰度图
	{
		step = bmpImg->width;
		offset = step%4;
		if (offset != 4)
		{
			step += 4-offset;
		}
 
		bmpFileHeader.bfSize = 54 + 256*4 + bmpImg->width;
		bmpFileHeader.bfReserved1 = 0;
		bmpFileHeader.bfReserved2 = 0;
		bmpFileHeader.bfOffBits = 54 + 256*4;
		fwrite(&bmpFileHeader, sizeof(ClBitMapFileHeader), 1, pFile);
 
		bmpInfoHeader.biSize = 40;
		bmpInfoHeader.biWidth = bmpImg->width;
		bmpInfoHeader.biHeight = bmpImg->height;
		bmpInfoHeader.biPlanes = 1;
		bmpInfoHeader.biBitCount = 8;
		bmpInfoHeader.biCompression = 0;
		bmpInfoHeader.biSizeImage = bmpImg->height*step;
		bmpInfoHeader.biXPelsPerMeter = 0;
		bmpInfoHeader.biYPelsPerMeter = 0;
		bmpInfoHeader.biClrUsed = 256;
		bmpInfoHeader.biClrImportant = 256;
		fwrite(&bmpInfoHeader, sizeof(ClBitMapInfoHeader), 1, pFile);
 
		quad = (ClRgbQuad*)malloc(sizeof(ClRgbQuad)*256);
		for (i=0; i<256; i++)
		{
			quad[i].rgbBlue = i;
			quad[i].rgbGreen = i;
			quad[i].rgbRed = i;
			quad[i].rgbReserved = 0;
		}
		fwrite(quad, sizeof(ClRgbQuad), 256, pFile);
		free(quad);
 
		for (i=bmpImg->height-1; i>-1; i--)
		{
			for (j=0; j<bmpImg->width; j++)
			{
				pixVal = bmpImg->imageData[i*bmpImg->width+j];
				fwrite(&pixVal, sizeof(unsigned char), 1, pFile);
			}
			if (offset!=0)
			{
				for (j=0; j<offset; j++)
				{
					pixVal = 0;
					fwrite(&pixVal, sizeof(unsigned char), 1, pFile);
				}
			}
		}
	}
	fclose(pFile);
 
	return true;
}
#endif

chenLeeCV.h

#ifndef CHENLEECV_H
#define CHENLEECV_H
 
typedef struct
{
	//unsigned short    bfType;
	unsigned long    bfSize;
	unsigned short    bfReserved1;
	unsigned short    bfReserved2;
	unsigned long    bfOffBits;
} ClBitMapFileHeader;
 
typedef struct
{
	unsigned long  biSize; 
	long   biWidth; 
	long   biHeight; 
	unsigned short   biPlanes; 
	unsigned short   biBitCount;
	unsigned long  biCompression; 
	unsigned long  biSizeImage; 
	long   biXPelsPerMeter; 
	long   biYPelsPerMeter; 
	unsigned long   biClrUsed; 
	unsigned long   biClrImportant; 
} ClBitMapInfoHeader;
 
typedef struct 
{
	unsigned char rgbBlue; //该颜色的蓝色分量
	unsigned char rgbGreen; //该颜色的绿色分量
	unsigned char rgbRed; //该颜色的红色分量
	unsigned char rgbReserved; //保留值
} ClRgbQuad;
 
typedef struct
{
	int width;
	int height;
	int channels;
	unsigned char* imageData;
}ClImage;
 
ClImage* clLoadImage(char* path);
//bool clSaveImage(char* path, ClImage* bmpImg);
 
#endif

main.c

//#include "stdafx.h"
#include <stdio.h>
#include "chenLeeCV.h"

unsigned char bgr_buffer[6220800];
unsigned char yuv444_buffer[6220800];
unsigned char nv12_buffer[3110400];

unsigned char b_buffer[2073600];
unsigned char g_buffer[2073600];
unsigned char r_buffer[2073600];


int process(char *path)
{
	ClImage* img = clLoadImage(path);
	char *bgrimage_fake = "bgr_fake.data";
	FILE *fp_bgr_fake = fopen(bgrimage_fake,"a+");
	if(NULL == fp_bgr_fake)
	{
		printf("open file[%s] failed!\n", bgrimage_fake);
		return -1;
	}

	fwrite((void*)img->imageData, 1, 6220800, fp_bgr_fake);
	fclose(fp_bgr_fake);

	memset((void*)b_buffer,0,2073600);
	memset((void*)g_buffer,0,2073600);
	memset((void*)r_buffer,0,2073600);

	int i = 0;
	int j = 0;
	int k = 0;

	static int num = 1;

	for(i = 0; i < 1080; i++)
	{
		for(j = 0; j < 1920; j++)
		{
			b_buffer[i*1920+j] = *((unsigned char*)img->imageData + k);
			k++;
			g_buffer[i*1920+j] = *((unsigned char*)img->imageData + k);
			k++;
			r_buffer[i*1920+j] = *((unsigned char*)img->imageData + k);
			k++;
		}
	}
#if 0
	char *bimage = "b.data";
	FILE *fp_b = fopen(bimage,"a+");
	if(NULL == fp_b)
	{
		printf("open file[%s] failed!\n", bimage);
		return -1;
	}

	fwrite((void*)b_buffer, 1, 2073600, fp_b);
	fclose(fp_b);

	char *gimage = "g.data";
	FILE *fp_g = fopen(gimage,"a+");
	if(NULL == fp_g)
	{
		printf("open file[%s] failed!\n", gimage);
		return -1;
	}

	fwrite((void*)g_buffer, 1, 2073600, fp_g);
	fclose(fp_g);

	char *rimage = "r.data";
	FILE *fp_r = fopen(rimage,"a+");
	if(NULL == fp_r)
	{
		printf("open file[%s] failed!\n", rimage);
		return -1;
	}

	fwrite((void*)r_buffer, 1, 2073600, fp_r);
	fclose(fp_r);
#endif

	memset((void*)bgr_buffer,0,6220800);

	/* 这张bmp图是按照grbgrb这么存放的,即我们认为的b其实是真实的g,g是r,r是b,虽然不知道为什么会这样 */
	k = 0;

	for(i = 0; i < 1080; i++)
	{
		for(j = 0; j < 1920;)
		{
			bgr_buffer[i * 1920  + j] = r_buffer[k];
			bgr_buffer[i * 1920  + j + 1] = b_buffer[k];
			bgr_buffer[i * 1920  + j + 2] = g_buffer[k];
			j+=3;
			k++;
		}
	}

	char *bgrimage = "bgr.data";
	FILE *fp_bgr = fopen(bgrimage,"a+");
	if(NULL == fp_bgr)
	{
		printf("open file[%s] failed!\n", bgrimage);
		return -1;
	}

	fwrite((void*)bgr_buffer, 1, 6220800, fp_bgr);
	fclose(fp_bgr);

	return 0;
}

int main(int argc, char* argv[])
{
	int i = 0;
	char photo_path[256];

	for(i = 1; i < 61; i++)
	{
		sprintf(photo_path, "photo_test/%d.bmp",i);//这里是进行60张BMP图片处理
		process(photo_path);
	}
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

BMP图像读取数据 的相关文章

  • 2-11寻找链表中的环

    题目描述 传入一个头节点判断链表是否有环 如果有环返回第一个入环的节点 如果没有环返回null 解题方法1 可以使用哈希表来完成 每遍历一个节点就把该节点的引用存储到哈希表 如果哈希表中出现了重复的引用 那么那个重复的引用就是第一个入环的节
  • vue-lazyload基础实例(基于vue2.0和vue-router2.0)

    首先引入依赖 import Vue from vue import Router from vue router import VueLazyload from vue lazyload 配置vue lazyload Vue use Vue
  • 关于使用vue安装项目的时候出现了 command failed: pnpm install --reporter silent --shamefully-hoist 报错

    依靠 pnpm 使用脚手架创建 vue 项目时 出现了 command failed pnpm install reporter silent shamefully hoist 奇葩的报错 寻查无果 后觉察到是由于我使用的文件系统不支持硬链
  • 标题Ant Design of Vue 组件库中Modal“确认“按钮和“取消“按钮成英文状态

    标题Ant Design of Vue 组件库中Modal 确认 按钮和 取消 按钮成英文状态 因为是国际化的原因 造成确定按钮和取消按钮变成英文 需要设置 okText 与 cancelText 以自定义按钮文字 div div
  • Battery Charging Specification(BC1.2) 和 QC2.0 笔记

    BC2 说明 参数说明 标准检测流程 VBUS检测 VBUS Detect PD 移动设备 中有个检测VBUS是否有效的电路 电路有一个参考值 高于这个值就认为是VBUS有效了 这个参考值不是固定的 设计的时候保证它在0 8V 4V之间就可
  • [机器学习与scikit-learn-20]:算法-逻辑回归-线性逻辑回归linear_model.LogisticRegression与代码实现

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 机器学习与scikit learn 20 算法 逻辑回归 线性逻辑回归linear model LogisticRegression与代码实
  • Web服务器群集:LVS+Keepalived高可用群集

    目录 一 理论 1 Keepalived 2 VRRP协议 虚拟路由冗余协议 3 部署LVS Keepalived 高可用群集 二 实验 1 LVS Keepalived 高可用群集 三 问题 1 备服务器网卡启动报错 四 总结 一 理论
  • 平衡二叉排序树插入结点的学习总结

    最近写了平衡二叉排序树代码 在这里对自己的理解做一下总结 下面的文字 更多的是把我自己的遇到的理解上的问题和思路讲清楚 可能不能让你一下就看明白 这是我的问题 网上其实有很多写的很好的文章 我也是学他们的 然后通过写文章来考研自己是不是真的
  • Redis之坑:Redis与MySQL中事务的区别

    Redis之坑 spring data redis中的Redis事务 Redis之坑 理解Redis事务 Redis之坑 Redis与MySQL中事务的区别 Transaction之坑 数据库事务 Transaction之坑 Spring中
  • 【模型剪枝】——开源项目总结

    修剪是一种常用的压缩神经网络模型的技术 修剪方法探索模型权重 参数 中的冗余 并尝试删除 修剪冗余和非关键权重 冗余元素从模型中修剪 它们的值归零 我们确保它们不参与反向传播过程 pytorch pruning https github c
  • 设置定时任务为每天凌晨2点执行和每小时执行一次?

    每天凌晨2点 0 0 2 和每天隔一小时 0 1 例1 每隔5秒执行一次 5 例2 每隔5分执行一次 0 5 在26分 29分 33分执行一次 0 26 29 33 例3 每天半夜12点30分执行一次 0 30 0 注意日期域为0不是24
  • axure9怎么让页面上下滑动_Axure动态面板(上下左右滑动页面)

    手机端交互中 页面的上下左右滑动是常用的交互形态 今天给大家分享一下如何使用Axure来进行模拟 这里使用动态面板来实现 如果对动态面板不是很了解的同学 请查看专栏里的 动态面板入门教程 先看效果 开工之前我们我们先分析一下 滑动效果的用处
  • 利用Android Lost通过互联网或短信远程控制安卓设备

    利用Android Lost通过互联网或短信远程控制安卓设备 作者 Jack Wallen 杰克 瓦伦翻译 PurpleEndurer 2014 11 15第1版 使用智能手机要考虑的一个至关重要的因素是安全性 当然 安全问题不仅仅存在于平
  • java springboot -- MultipartFile -图片上传到远程服务器上

    新增文件 param file return private boolean saveFile MultipartFile file try 文件保存路径 String filePath A merchant 映射的地址 String fi
  • Springboot+vue+hadoop+java图书个性化推荐系统

    前台首页功能模块 3 1首页 图书个性化推荐系统 在前台首页可以查看首页 图书信息 好书推荐 留言反馈 个人中心 后台管理等内容 如图 3 2图书信息 在图书信息页面通过查看图书编号 图书名称 图书类别 图片 作者 出版社 版次 数量 点击
  • 背单词(持续更新)

    文章目录 星火雅思周计划 229 复习 考研 352 353 职场俚语 1 2 7分 1 2 3 4 5 6 7 8 haochi fun 1 2 GRE 1 2 托福 249 247 248 245 246 243 244 241 242
  • 3WebGL shader准备工具

    VSCode安装 VSCode 全称 Visual Studio Code 是一款由微软开发且跨平台的免费源代码编辑器 该软件支持语法高亮 代码自动补全 又称 IntelliSense 代码重构 查看定义功能 并且内置了命令行工具和 Git
  • Unity保存图片到相册

    Unity保存图片到Android相册 Java 纯文本查看 复制代码 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
  • ESXI 7.0 版本配置N卡显卡直通

    ESXI 7 版本配置N卡显卡直通 前因 ESXI版本太新 网上啥参考资料没有 显卡直通各种问题 虚机一装显卡驱动就直接把宿主机直接整挂了 于是各种查资料 各种尝试 终于搞定直通问题 配置 名称 版本 服务器 DELL R720 ESXI
  • MySQL中的DML、DDL、DCL到底是什么玩意呢?

    个人主页 极客小俊 作者简介 web开发者 设计师 技术分享博主 希望大家多多支持一下 我们一起进步 如果文章对你有帮助的话 欢迎评论 点赞 收藏 加关注 引言 一直以来 很多人分不清这三个东西到底是什么简称 代表什么 至在面试中遇到可能会

随机推荐

  • nginx的location、root、alias指令用法和区别

    亲测可用 若有疑问请私信 nginx指定文件路径有两种方式root和alias 指令的使用方法和作用域 root 语法 root path 默认值 root html 配置段 http server location if alias 语法
  • Arduino动手做(48)---三轴ADXL345模块

    37款传感器与模块的提法 在网络上广泛流传 其实Arduino能够兼容的传感器模块肯定是不止37种的 鉴于本人手头积累了一些传感器和模块 依照实践 动手试试 出真知的理念 以学习和交流为目的 这里准备逐一做做实验 不管能否成功 都会记录下来
  • 第十二届蓝桥杯 2021年省赛真题 (Java 大学C组) 第二场

    蓝桥杯 2021年省赛真题 Java 大学C组 第二场 A 浮点数 B 求余 C 双阶乘 D 格点 E 整数分解 F 3 的倍数 G 特殊年份 H 小平方 I 完全平方数 J 负载均衡 A 浮点数 题目 问题描述 IEEE 754 规定一个
  • 关于HTML基本标签及结构详解

    本文主要介绍了HTML基本标签及结构详解 本文给大家介绍的非常详细 对大家的学习或工作具有一定的参考借鉴价值 需要的朋友可以参考下 1 HTML概述 1 HTML 超文本标记语言 是一种标识性语言 非编程语言 不能使用逻辑运算 通过标签将网
  • 吴恩达 deeplearning.ai课程-卷积神经网络 (2)深度卷积模型-实例探究

    参考来源 https blog csdn net red stone1 article details 78769236 https blog csdn net koala tree article details 78531398 有关C
  • python自动化笔记(九)文件操作

    文件的打开 file open test txt w encoding utf 8 参数 文件名 访问模式 write 默认为read file write hello python 删除原有内容 并写入 ret file read 读取文
  • Flutter使用百度定位经纬度数据正常,详细地址为null

    Flutter使用百度定位经纬度数据正常 详细地址为null 更新至2021 09 07 一 问题 1 使用百度定位 插件返回的数据中经纬度有正常值 其他地址信息都为null 二 分析原因 1 在wifi或移动网络没有 不好的情况下 会出现
  • 自动注册appleid

    1 通过猴油注册脚本 用js填写表单 问题 由于apple官网采用了自己封装的mvvm框架 如果只是赋值的话 还不能把视图上的数据更新到model上 必须触发一下表单元素的input事件或者change事件完成model的更新 CSP网站安
  • 孤儿进程和僵尸进程

    作者 华清远见讲师 前段时间 由于研究经典面试题 把孤儿进程和僵尸进程也总结了一下 我们有这样一个问题 孤儿进程和僵尸进程 怎么产生的 有什么危害 怎么去预防 下面是针对此问题的总结与概括 一 产生的原因 1 一般进程 正常情况下 子进程由
  • vue 表格表头内容居中

    放入
  • elasticsearch的object类型和动态映射

    我们需要讨论的最后一个自然JSON数据类型是对象 object 在其它语言中叫做hash hashmap dictionary 或者 associative array 内部对象 inner objects 经常用于在另一个对象中嵌入一个实
  • node mysql高级用法_nodejs中mysql用法

    1 建立数据库连接 createConnection Object 方法 该方法接受一个对象作为参数 该对象有四个常用的属性host user password database 与php中链接数据库的参数相同 属性列表如下 host 连接
  • Xray使用教程

    简介 Xray是长亭科技开发的一款漏扫工具 支持多种扫描方式和漏洞类型 可自定义POC Proof of Concept 概念验证 即漏洞验证程序 俺是在 乌雲安全 看到了这个工具的使用 作为一个脚本小子初学者 这里做一下笔记 使用 web
  • NVDLA系列之C-model:cvif<99>

    NV NVDLA cvif cpp WriteRequest sdp2cvif void NV NVDLA cvif WriteRequest sdp2cvif uint64 t base addr uint64 t first base
  • 通过递归,实现数组转树

    一 为什么需要数组转树 当我们做后台管理系统时难免会遇到关于公司组织架构这样的模块 一个部门下会有好几个小部门 这时我们就可以运用树形图来更好地进行查看 下面简单举例 将数组 const arr id 1 pid 0 name 生鲜 id
  • linux安装分区详解lvm,Linux下LVM的配置详解

    LVM是Logical Volume Manager 逻辑卷管理器 的简写 它为主机提供了更高层次的磁盘存储管理能力 LVM可以帮助系统管理员为应用与用户方便地分配存储空间 在LVM管理下的逻辑卷可以按需改变大小或添加移除 另外 LVM可以
  • 【正点原子探索者STM32F407开发板例程连载+教学】第30章 SPI通信实验

    第三十章 SPI 实验 mw shl code c true 1 硬件平台 正点原子探索者STM32F407开发板 2 软件平台 MDK5 1 3 固件库版本 V1 4 0 mw shl code 本章我们将向大家介绍STM32F4的SPI
  • upload-labs通关(Pass-06~Pass-10)

    目录 Pass 06 Pass 07 Pass 08 Pass 09 Pass 10 Pass 06 上传sh php失败 burp中将抓到的包send to repeater 修改filename为sh xxx发现可以上传成功 说明是黑名
  • 线上常见问题排查之CPU过高

    目前应用程序基本是Java 所以需要登录docker容器内部执行jstack命令打印堆栈信息再分析 确认目标进程 执行top命令查看CPU占用情况 找出CPU占用高的进程ID PS 输入大写P即可按照CPU占比排序进程 即 Shift p
  • BMP图像读取数据

    我们在使用Windows的画图软件 画一张图 然后保存成24位位图BMP图像后 要对这幅图像进行一系列的格式转换之前 需要先将BMP里的数据提取出来 然后再保存成BGR888的图像 有两处细节要注意 第一 我们直接保存成BMP图片 不知道为