热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

求教各位关于BMP图像处理的专业问题及解决方案

目前我有两张BMP图像文件a.bmp和b.bmp,希望将它们按照以下方式进行融合:首先提取a.bmp的所有奇数行像素(如第1、3、5行),接着获取b.bmp的所有偶数行像素(如第2、4、6行)。最终目标是将这些行像素交替排列,生成一张新的图像。此过程需要确保像素顺序正确,并保持图像的整体结构和质量。
现在有两幅bmp图象a.bmp,b.bmp,我现在想以如下方式把这两幅图象合并成一幅图象:
取图象a.bmp的奇数行象素(1,3,5...),再取b.bmp的偶数行象素(2,4,6...),
然后把这些象素合并成一幅图象,请问我该怎么实现,望大家不吝指教,多谢!
问题解决,立即结帐^_^

10 个解决方案

#1


关注

#2


你应该先把BMP文件的格式看明白。然后再做这个。如果BMP文件格式明白了,这个问题就是一个循环的问题。算出图象的高度的一半,在A中取i,在B中去2*i-1。读取行的时候必须将图象的宽度乘像素点的位数。比如,32位的得乘以4,16位的乘以2等。具体不明白的可以和我用MSN联系:yuhpvct@hotmail.com
ffish——胖胖鱼

#3


我用vb做过。vc没有试验过。看看有没有什么取各个相素点的RGB值得函数然后再在新的图形里进行绘画就可以了!还能做处理。我有vb的代码。

#4


谢谢上面两位关注,
跟胖胖鱼说:我看了一下bmp的格式,在不同的象素位下它的格式不一样如8和24,8的数据值是颜色表的索引,然而24的值就是(RGB),还有一些文件是经过压缩的(行程长度编码,rle),
那会给我们在处理不同色深的bmp文件带来许多问题,是否有vc或者vb中有这样的函数,不用管这些东西,只管合并就好了。还有你上面讲的,是否是指直接从a,b读字节,然后写文件。

跟病毒情书说:这位朋友,能否把你的代码贴出来,分享一下,VB的也好!多谢!

#5


理论上用GetPixel()是可以取得的,但那样太慢了,如果你想做好一点的话,只有分析DIB格式(即Bitmap),不仅仅是8Bit, 24Bit,还有16Bit, 32Bit等等,16Bit是555格式的,如果是写游戏,还要考虑显卡的565格式,DIB的16Bit是555格式的。

我不记得GetPixel()会不会帮你在各种颜色深度下自动帮你转换正确的RGB,VB下是很容易写的,我N年前就写过,不过那实在太慢了,GetPixel()太慢。

还要注意一点,Bitmap是从左下角开始扫描数据的,Y轴是倒过来的,不注意图像就倒立了,呵呵。研究一下Bitmap格式有好处,以后可以用来写DirectX(DirectDraw)

#6


至于rle压缩的,一般的程序考虑的很少,可以暂时不理,如果你写完善了再去处理不迟。

#7


是应该从简单到难的入手。8位的一般是黑白图象。上面有一个调色板的东西,我在书上看过代码,感觉是从0开始付值,格式是每次付4个字节,如4的付值为0010,0010,0010,0000(位数可能部不对)。我想不出来它到底有什么用处,所以在提取的时候可以直接读想素点信息。16位的基本上已经不使用了。它的主要格式是RGB的555或者565(真彩16色), 就是每个像素点为一个字节(16),RGB颜色如前分的。24位和32位的就简单多了。24位为每个像素点为一个字(8),但是主要问题是RGB或者BGR32位的是在24位的基础上多一个字(8)的空位。也是注意空的位置。另外BMP图象中含有图象的宽度和高度信息,高度信息可以不做处理,直接使用,但是宽度信息需要做处理,原因是这两个信息都是表示像素点个数的,而一个像素又是不同字节(字)的,因此需要乘以这个数,才能一次读取一行的像素。至于最终显示,我认为是合成之后的事情了。一种可能是使用GetPixel()函数,另一种就是重新合成BMP文件格式的内存段,对内存段进行图象的显示。函数为:SetStretchBltMode()和StretchDIBits()。一家之言,仅供参考。
ffish——胖胖鱼

#8


补充一点,8位不一定是黑白图像,很多都是彩色的,调色板是256色的,每个颜色索引是4个字节,其结构定义是:

typedef struct tagRGBQUAD {
  BYTE    rgbBlue; 
  BYTE    rgbGreen; 
  BYTE    rgbRed; 
  BYTE    rgbReserved; 
} RGBQUAD;

然后每个像素的值都是这个颜色的索引值,从索引里取得真正的颜色值。

#9


补充一点,8位不一定是黑白图像,很多都是彩色的,调色板是256色的,每个颜色索引是4个字节,其结构定义是:

typedef struct tagRGBQUAD {
  BYTE    rgbBlue; 
  BYTE    rgbGreen; 
  BYTE    rgbRed; 
  BYTE    rgbReserved; 
} RGBQUAD;

然后每个像素的值都是这个颜色的索引值,从索引里取得真正的颜色值。

#10


我现在有个问题,如果我要合并8位的位图,那么他们的调色板是否一样的,就是
typedef struct tagRGBQUAD {
  BYTE    rgbBlue; 
  BYTE    rgbGreen; 
  BYTE    rgbRed; 
  BYTE    rgbReserved; 
} RGBQUAD;数组中的数据是否一样的?如果不一样的话,那么仅仅合并位图的数据会导致颜色
的改变。

推荐阅读
  • 深入解析Redis内存对象模型
    本文详细介绍了Redis内存对象模型的关键知识点,包括内存统计、内存分配、数据存储细节及优化策略。通过实际案例和专业分析,帮助读者全面理解Redis内存管理机制。 ... [详细]
  • 本题探讨了在大数据结构背景下,如何通过整体二分和CDQ分治等高级算法优化处理复杂的时间序列问题。题目设定包括节点数量、查询次数和权重限制,并详细分析了解决方案中的关键步骤。 ... [详细]
  • ElasticSearch 集群监控与优化
    本文详细介绍了如何有效地监控 ElasticSearch 集群,涵盖了关键性能指标、集群健康状况、统计信息以及内存和垃圾回收的监控方法。 ... [详细]
  • 基于KVM的SRIOV直通配置及性能测试
    SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ... [详细]
  • 深入探讨CPU虚拟化与KVM内存管理
    本文详细介绍了现代服务器架构中的CPU虚拟化技术,包括SMP、NUMA和MPP三种多处理器结构,并深入探讨了KVM的内存虚拟化机制。通过对比不同架构的特点和应用场景,帮助读者理解如何选择最适合的架构以优化性能。 ... [详细]
  • 本题通过将每个矩形视为一个节点,根据其相对位置构建拓扑图,并利用深度优先搜索(DFS)或状态压缩动态规划(DP)求解最小涂色次数。本文详细解析了该问题的建模思路与算法实现。 ... [详细]
  • 实体映射最强工具类:MapStruct真香 ... [详细]
  • 本次考试于2016年10月25日上午7:50至11:15举行,主要涉及数学专题,特别是斐波那契数列的性质及其在编程中的应用。本文将详细解析考试中的题目,并提供解题思路和代码实现。 ... [详细]
  • 本文介绍如何使用 Python 获取文件和图片的创建、修改及拍摄日期。通过多种方法,如 PIL 库的 _getexif() 函数和 os 模块的 getmtime() 和 stat() 方法,详细讲解了这些技术的应用场景和注意事项。 ... [详细]
  • 深入解析TCP/IP五层协议
    本文详细介绍了TCP/IP五层协议模型,包括物理层、数据链路层、网络层、传输层和应用层。每层的功能及其相互关系将被逐一解释,帮助读者理解互联网通信的原理。此外,还特别讨论了UDP和TCP协议的特点以及三次握手、四次挥手的过程。 ... [详细]
  • 树链问题的优化解法:深度优先搜索与质因数分解
    本文介绍了一种通过深度优先搜索(DFS)和质因数分解来解决最长树链问题的方法。我们通过枚举树链上的最大公约数(GCD),将所有节点按其质因子分类,并计算每个类别的最长链,最终求得全局最长链。 ... [详细]
  • Netflix利用Druid实现高效实时数据分析
    本文探讨了全球领先的在线娱乐公司Netflix如何通过采用Apache Druid,实现了高效的数据采集、处理和实时分析,从而显著提升了用户体验和业务决策的准确性。文章详细介绍了Netflix在系统架构、数据摄取、管理和查询方面的实践,并展示了Druid在大规模数据处理中的卓越性能。 ... [详细]
  • Python处理Word文档的高效技巧
    本文详细介绍了如何使用Python处理Word文档,涵盖从基础操作到高级功能的各种技巧。我们将探讨如何生成文档、定义样式、提取表格数据以及处理超链接和图片等内容。 ... [详细]
  • Windows 7 64位系统下Redis的安装与PHP Redis扩展配置
    本文详细介绍了在Windows 7 64位操作系统中安装Redis以及配置PHP Redis扩展的方法,包括下载、安装和基本使用步骤。适合对Redis和PHP集成感兴趣的开发人员参考。 ... [详细]
  • 在多线程编程环境中,线程之间共享全局变量可能导致数据竞争和不一致性。为了解决这一问题,Linux提供了线程局部存储(TLS),使每个线程可以拥有独立的变量副本,确保线程间的数据隔离与安全。 ... [详细]
author-avatar
呵呵哒
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有