热门标签 | 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;数组中的数据是否一样的?如果不一样的话,那么仅仅合并位图的数据会导致颜色
的改变。

推荐阅读
  • 如何将TS文件转换为M3U8直播流:HLS与M3U8格式详解
    在视频传输领域,MP4虽然常见,但在直播场景中直接使用MP4格式存在诸多问题。例如,MP4文件的头部信息(如ftyp、moov)较大,导致初始加载时间较长,影响用户体验。相比之下,HLS(HTTP Live Streaming)协议及其M3U8格式更具优势。HLS通过将视频切分成多个小片段,并生成一个M3U8播放列表文件,实现低延迟和高稳定性。本文详细介绍了如何将TS文件转换为M3U8直播流,包括技术原理和具体操作步骤,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 在《Cocos2d-x学习笔记:基础概念解析与内存管理机制深入探讨》中,详细介绍了Cocos2d-x的基础概念,并深入分析了其内存管理机制。特别是针对Boost库引入的智能指针管理方法进行了详细的讲解,例如在处理鱼的运动过程中,可以通过编写自定义函数来动态计算角度变化,利用CallFunc回调机制实现高效的游戏逻辑控制。此外,文章还探讨了如何通过智能指针优化资源管理和避免内存泄漏,为开发者提供了实用的编程技巧和最佳实践。 ... [详细]
  • 视频编码涉及多个关键参数,如比特率、帧率和采样率等。比特率(Bit Rate)是指单位时间内视频或音频文件的数据传输量,通常以千比特每秒(Kbps)为单位。这些参数对视频质量和文件大小有重要影响。帧率(Frame Rate)表示每秒钟显示的图像帧数,而采样率(Sample Rate)则指每秒从连续信号中提取并形成离散信号的次数。了解这些基础概念有助于更好地优化视频编码效果。 ... [详细]
  • 深入解析Android 4.4中的Fence机制及其应用
    在Android 4.4中,Fence机制是处理缓冲区交换和同步问题的关键技术。该机制广泛应用于生产者-消费者模式中,确保了不同组件之间高效、安全的数据传输。通过深入解析Fence机制的工作原理和应用场景,本文探讨了其在系统性能优化和资源管理中的重要作用。 ... [详细]
  • 使用 ListView 浏览安卓系统中的回收站文件 ... [详细]
  • 在Android平台中,播放音频的采样率通常固定为44.1kHz,而录音的采样率则固定为8kHz。为了确保音频设备的正常工作,底层驱动必须预先设定这些固定的采样率。当上层应用提供的采样率与这些预设值不匹配时,需要通过重采样(resample)技术来调整采样率,以保证音频数据的正确处理和传输。本文将详细探讨FFMpeg在音频处理中的基础理论及重采样技术的应用。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 本文介绍如何使用 Python 的 DOM 和 SAX 方法解析 XML 文件,并通过示例展示了如何动态创建数据库表和处理大量数据的实时插入。 ... [详细]
  • 开发日志:高效图片压缩与上传技术解析 ... [详细]
  • 在Linux系统中避免安装MySQL的简易指南
    在Linux系统中避免安装MySQL的简易指南 ... [详细]
  • Android 构建基础流程详解
    Android 构建基础流程详解 ... [详细]
  • 如何使用AU进行专业音频剪辑与处理?首先,创建多轨会话:在菜单中依次选择【文件】→【新建】→【多轨会话】。接下来,编辑项目的基本信息。对于初学者来说,初始设置可能会显得复杂且难以理解,但这是确保项目顺利进行的重要步骤。熟悉这些设置后,你将能够更高效地进行音频剪辑与处理。 ... [详细]
  • 卓盟科技:动态资源加载技术的兼容性优化与升级 | Android 开发者案例分享
    随着游戏内容日益复杂,资源加载过程已不仅仅是简单的进度显示,而是连接玩家与开发者的桥梁。玩家对快速加载的需求越来越高,这意味着开发者需要不断优化和提升动态资源加载技术的兼容性和性能。卓盟科技通过一系列的技术创新,不仅提高了加载速度,还确保了不同设备和系统的兼容性,为用户提供更加流畅的游戏体验。 ... [详细]
  • 使用Maven JAR插件将单个或多个文件及其依赖项合并为一个可引用的JAR包
    本文介绍了如何利用Maven中的maven-assembly-plugin插件将单个或多个Java文件及其依赖项打包成一个可引用的JAR文件。首先,需要创建一个新的Maven项目,并将待打包的Java文件复制到该项目中。通过配置maven-assembly-plugin,可以实现将所有文件及其依赖项合并为一个独立的JAR包,方便在其他项目中引用和使用。此外,该方法还支持自定义装配描述符,以满足不同场景下的需求。 ... [详细]
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社区 版权所有