1.BMP是一种与硬件无关的图像文件格式,它所占用的空间很大,不采用其他任何压缩,它的深度可选1个字节,4个字节,8个字节,24个字节,我们通常所说的真彩色就是24个字节,BMP图像的扫描方式是从下往上,从左到右,当文件的宽度不是4的倍数是,要通过补0来使文件是4的倍数,但是由于BMP图像文件占得内存太大,我们平常都不用这种格式。
2.BMP文件结构
位图文件 头数据结构,它包含BMP图像文件的内容,显示内容等信喜,大小是14个字节。
位图信息数据结构,它包含了图像的宽和高,通常我们要显示一张图片时,必须要把这两个数据从图像中读出来。
调色板 像我们说的24位真彩色图的BMP不需要调色板
位图数据 这一项比较重要,当要显示一张图片时,一定要遍历整个图片,从下往上,从左往右依次得到三种不同的颜色。
3.BMP文件解析实现
要将既定位置的图片显示出来,必须要用到输入流,因为输入流是将硬盘中的数据读到内存中来,不能只用输入流,还必须配合使用dataInputStream 或者是BufferedInputStream,
FileInputStream fis=new FileInputStream(path);//创建文件输入流
BufferedInputStream bis=new BufferedInputStream(fis);//将文件流打包
其实不用缓冲流而用dataInputStream也行,效果是一样的,当创建好输入流之后,就应该读取既定位置图像的头文件,以及图像的宽度和高度。
int Btop=14;//头部的长度
byte []b=new byte[Btop];//定义一个存入图像头部的数组
bis.read(b,0,Btop);//将图像头部的14个字节读到数组b中
int blien=40;//读入位图信息头
byte [] bc=new byte[blien];//定义一个存入位图信息头的数组
bis.read(bc,0,blien);//将位图信息头的40个字节读到数组bc中
image_width=changInt(bc,7);//获取图形的宽度
image_height=changInt(bc,11);//获取图形的高度
public static int changInt(byte []bi,int i){
return(((int)bi[i]&0xFF)<<24)|(((int)bi[i-1]&0xFF)<<16)|(((int)bi[i-2]&0xFF)<<8)|((int)bi[i-3]&0xFF);
}
因为图像的宽和高是存在第7个和第11个位置,所以传的索引值为7和11,存在数组中的是字节,所以要将byte转化成int型,又因为它读出来的位置是倒序的,所以第i个位置需左移24位才能到高8位,依次类推,要得到int值,只需将它们每8个字节先与0xff进行逻辑与,在将它们逻辑或,就可得到想要的值。
现在要做的就是读取位图数据:
public void readRGB(BufferedInputStream bis){
if(!(image_width*3%4==0)){
skip_width = 4-image_width*3%4;
}
//装载RGB颜色的数据数组
imageR=new int[image_height][image_width];
imageG=new int[image_height][image_width];
imageB=new int[image_height][image_width];
//读取位图数据,按行读取,从下到上,从左到右
for(int h=image_height-1;h>=0;h--){
for(int w=0;w<image_width;w++){
//读入三原色
try{
int blue=bis.read();
int green=bis.read();
int red=bis.read();
imageR[h][w]=red;
imageG[h][w]=green;
imageB[h][w]=blue;
// if(w==0){//跳过补0项
// System.out.println(dis.skipBytes(skip_width));
// }
}catch(IOException e){
e.printStackTrace();
}
if(w==0){
try{
bis.skip(skip_width);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
当我们读取了位图数据之后,需要将图像显示出来,要显示图片肯定要需要窗体,所以我们再需要写一个方法,该方法是用来显示窗体的。
public void showUI(String path){
this.setTitle(path);
this.setLocationRelativeTo(null);
this.setSize(image_width,image_height);//弹出一个图片大的大小的窗体
this.setResizable(false);
this.setDefaultCloseOperation(3);
this.setVisible(true);//窗体可见
graphics=this.getGraphics();//得到画布
repaint();
}
我们将图像的信息读取出来之后,就要将它显示出来,故要写一个paint方法:
/**
* 把的到得数据显示出来
*/
public void paint(Graphics g){
for(int h=0;h<image_height;h++){
for(int w=0;w<image_width;w++){
g.setColor(new java.awt.Color(imageR[h][w],imageG[h][w],imageB[h][w]));
g.drawLine(w, h, w, h);
}
}
}
整个BMP文件格式解析就已经实现了,实验的结果是:
操作中遇到的问题:虽然BMP文件解析的思路比较明确,但是在实际操作中经常遇到问题:比如我所有程序写好之后,我图片没有改为BMP格式,出现java.lang.outOfmemorryError错误,还有当我画图时,用的是g.fillOval(w,h,w,h)方法时,出现的图形刚开始怪模怪样,到最后才呈现出源图的效果。还有就是那个不是4的倍数时,为什么是if(!(image_width*3%4==0))而不是if(!image_width%4==0),
- 大小: 638.3 KB
分享到:
相关推荐
"Comsol完美吸收器:可见光薄膜与金环宽带吸收器的二维斜入射研究",Comsol完美吸收器。 包含可见光薄膜完美吸收器,涉及二维斜入射。 包含金环宽带完美吸收器。 ,Comsol完美吸收器; 可见光薄膜完美吸收器; 二维斜入射; 金环宽带完美吸收器,"Comsol二维斜入射完美吸收器:可见光薄膜与金环宽带吸收技术"
免费JAVA毕业设计 2024成品源码+论文+数据库+启动教程 启动教程:https://www.bilibili.com/video/BV1SzbFe7EGZ 项目讲解视频:https://www.bilibili.com/video/BV1Tb421n72S 二次开发教程:https://www.bilibili.com/video/BV18i421i7Dx
,西门子S7-200smart型PLC使用profinet通讯控制G120变频器程序, 可以实现速度设定与读取,启停和故障复位等功能。
免费JAVA毕业设计 2024成品源码+论文+数据库+启动教程 启动教程:https://www.bilibili.com/video/BV1SzbFe7EGZ 项目讲解视频:https://www.bilibili.com/video/BV1Tb421n72S 二次开发教程:https://www.bilibili.com/video/BV18i421i7Dx
,大众斯柯达 免玻璃车道保持新方案
基于PFC5.0的岩石循环加卸载试验的3D实现技术,PFC5.0 3D实现岩石的循环加卸载试验, ,PFC5.0; 3D岩石; 循环加卸载试验; 岩石循环; 岩石加卸载模拟,"PFC5.0三维岩石循环加卸载试验研究"
nodejs010-nodejs-boom-0.4.2-2.el6.centos.alt.noarch.rpm
小学元旦晚会PPT 模版
STEP7-MicroWIN-SMART-V3.0测试版(2025.02最新)安装包-链接地址
内容概要:卷积神经网络(CNN)是一种特殊的神经网络模型,尤其适用于处理图像类的任务,如检测任务、分类与检索、超分辨率重构、医学任务、无人驾驶、人脸识别等。与传统神经网络输入一组向量值不同,CNN能够接受更为复杂的三维输入(深度、高度、宽度),从而有效地降低输入参数量并提高图像处理效率。文中介绍了卷积操作的基本原理及其在图像中的运用,例如通过设置合适的卷积核大小、步幅和零填充等手段,控制特征图的数量和尺度,进而达到优化网络性能的目的。此外还提及了卷积参数共享的概念以及池化层的作用。经典案例包括了AlexNet、VGG网路和残差网络的设计思想和结构特性,尤其是残差网络解决了非常深网络难以训练的问题,并提升了模型的表现力。感受野的介绍则强调了深层网络中的局部感知的重要性。 适合人群:从事计算机视觉领域的研究人员和技术人员,特别是关注图像识别和高级图像处理的研究人员或开发者。 使用场景及目标:①理解并掌握CNN的基本组成单元,如卷积层、池化层的工作机制;②深入探讨经典CNN架构背后的思路及其应用场景,帮助读者提升模型构建能力,以便更好地应用于实际项目中。
nodejs010-1.2-29.el6.centos.alt.x86_64.rpm
COMSOL注浆技术:浆液扩散模型及其应用研究,comsol注浆,浆液扩散模型 ,comsol注浆; 浆液扩散模型,"Comsol注浆技术下的浆液扩散模型研究"
"Modbus全功能调试工具:RTU、ASCII支持,主站调试必备,界面简洁易操作,数据记录与转换,串口助手功能齐备,自动应答及批量连续发送功能强大,学习测试必备利器",MobbusRTU ModbusASCII Modbus调试工具Modbus主站调试工具ModbusMaster支持所有Modbus设备调试; 功能强大,是学习测试的必备工具; 1.界面简洁 2.数据记录功能 3.串口助手功能 4.数据转功能 5.自动应答功能 5.批量发送功能 6.连续发送功能 ,ModbusRTU; ModbusASCII; 调试工具; 主站调试工具; ModbusMaster; 全部设备调试; 功能强大; 界面简洁; 数据记录; 串口助手; 数据转换; 自动应答; 批量发送; 连续发送。,"多功能Modbus调试工具:支持RTU/ASCII,主站必备,功能全面,操作简洁"
一个使用 C++ 结合 DeepSeek 模型进行文本相似度计算的源码。该实例会接收两段文本,借助 DeepSeek 模型提取文本特征,然后通过余弦相似度来衡量两段文本的相似程度。
内容概要:本文详细介绍了传统RNN网络存在的问题及其局限性,进而引出了Transformer模型的核心优势及其结构原理。传统RNN由于串行计算和无法有效处理长距离依赖等问题限制了其应用效果,尤其在自然语言处理领域表现不佳。相比之下,Transformer通过引入自注意力机制(self-attention mechanism)和平行化的架构解决了这些问题。自注意力机制允许模型在同一时间处理完整的输入序列,在计算每个位置的表征时不仅考虑到该位置的元素也综合了其他所有位置的相关度。此外,文章还具体讲解了多头注意力机制(multi-head attention),以及为何引入多头能够捕获更为丰富的语义特征;位置编码(positional encoding)的作用是为了赋予模型区分相同字符在不同顺序组合的意义能力;并在末尾提到了BERT这一基于Transformer的预训练模型及其两种主要训练方式——掩码语言模型(masked language model)和下一个句子预测(next sentence prediction)。总体而言,本文揭示了Transformers架构相对于以往序列建模方法的优势所在。 适合人群:对深度学习尤其是自然语言处理技术有一定基础的理解的研究人员和技术爱好者。 使用场景及目标:帮助读者深入理解为何传统递归神经网络受限于自身的设计无法很好地应对复杂的NLP任务,如翻译或文本摘要,并展示了Transformer是如何克服这些问题的;同时也旨在让有兴趣探索最先进预训练模型如BERT背后逻辑的人群受益。 阅读建议:鉴于本文涉及到大量数学概念与公式推导,请确保自己拥有坚实的机器学习基础知识并且愿意投入足够的时间消化吸收这些新信息。建议配合代码实现一起学习,在实践中加深对各个组件作用的认知。
混合励磁爪极电机在Maxwell中的仿真分析与优化研究,爪极电机 (混合励磁爪极电机) maxwell ,核心关键词:爪极电机; 混合励磁; 爪极电机Maxwell;,混合励磁爪极电机在Maxwell中的仿真研究
内容概要:本文介绍了DeepSeek模型在不同平台上部署的方法。首先阐述了基于Ollama的本地部署,包括Ollama的安装、模型拉取以及交互模式的使用。接着讲解了DeepSeek在移动设备(iOS和Android)上的部署细节:iPhone需要通过Safari安装快捷指令,配置API Key并通过快捷指令测试运行;Android则借助Termux安装必要组件,并手动搭建Ollama环境以加载和测试模型。最后详细叙述了基于Open WebUI部署的方式,涉及Ollama、Docker Desktop及Open WebUI的安装流程及其之间的配合使用来最终达成模型的成功部署。 适用人群:面向有兴趣了解或者实际操作DeepSeek模型跨平台部署的技术开发者、研究人员以及AI爱好者。 使用场景及目标:适用于希望利用DeepSeek模型快速构建本地化应用程序、开展实验研究的用户;具体目标为掌握DeepSeek模型在桌面系统(如Linux、macOS、Windows)、iOS和Android智能手机以及云端WebUI界面上的不同部署手段和技术。 其他说明:对于每种类型的部署都提供了详细的步骤指导,旨在帮助使用者顺利完成所需工具和环境的安装,并确保模型能够正常工作。文中给出的具体链接和命令行脚本,有助于降低初次接触者的上手难度,提升部署效率和成功率。此外,还强调了一些重要的配置注意事项,例如正确输入API key以及对Ollama的初始化检查等。
交变磁场感应材料对沥青路面温度影响的研究,交变磁场下含感应材料沥青路面温度 ,交变磁场; 感应材料; 沥青路面; 温度; 变化; 加热效率,交变磁场对含感应材料沥青路面温度的影响研究
"深度探讨:利用主从博弈理论,结合双层模型与遗传算法及yalmip+cplex求解器实现代码复现的电热综合能源系统动态定价与能量管理",代码复现 《基于主从博弈的电热综合能源系统动态定价与能量管理》 采用双层模型求解 上层为主问题使用遗传算法 下层为子问题调用yalmip+cplex求解器求解 有需要的联系留邮箱 ,代码复现; 动态定价; 能量管理; 主从博弈; 双层模型; 遗传算法; cplex求解器; 联系邮箱,代码复现:双层模型求解电热综合能源系统动态定价与能量管理策略
免费JAVA毕业设计 2024成品源码+论文+数据库+启动教程 启动教程:https://www.bilibili.com/video/BV1SzbFe7EGZ 项目讲解视频:https://www.bilibili.com/video/BV1Tb421n72S 二次开发教程:https://www.bilibili.com/video/BV18i421i7Dx