BMP的图像处理
近期碰到了一个问题将图片缩放:
进行了整理发现位图一些主要的结构能够进行整理,得出下面图表:
进行图片缩放的时候会进行一些处理(最临近差值法):
详细的代码例如以下:
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <windows.h>
#include <stdlib.h> LONG IWidth; //原图像的宽
LONG IHeight; //原图像的高
LONG biBitCount; //每像素位数
LONG INewWidth; //新图像的宽
LONG INewHeight; //新图像的高
LONG ILineByte; //原图像数据每行的字节数
LONG INewLineByte; //新图像数据每行的字节数
float zoomnumber=1; //初始放大倍数赋值为1
unsigned char *pIBuf; //原图像像素指针
unsigned char *pINewBuf;//新图像像素指针 int ReadBmp(const char* bmpName)//以二进制方式读入指定的图像文件
{
FILE *fp=fopen(bmpName,"rb");
if(fp==0)
{
printf("打开文件失败\n");
return 0;
} fseek(fp,sizeof(BITMAPFILEHEADER),0);//跳过位图文件头
BITMAPINFOHEADER head;//定义位图信息头结构体变量。存放在变量head中
fread(&head,sizeof(BITMAPINFOHEADER),1,fp);//获取图像的高、宽和每像素所占的位数,接收地址head。单个元素大小文件头大小。元素个数1个,输入流fp
IWidth = head.biWidth;
IHeight = head.biHeight;
biBitCount = head.biBitCount;
ILineByte = (IWidth *biBitCount/8+3)/4*4;//计算原图像每行字节数,/4*4以保证是4的倍数
pIBuf = new unsigned char [ILineByte *IHeight];//定义一个矩阵用以存放原图像像素信息。pIBuf指向首地址
fread(pIBuf,1,ILineByte *IHeight,fp);//获取源文件像素信息。接收地址pIBuf,单个元素大小1字节,元素个数每行字节数*行数,输入流fp
return 1;//成功返回1
} int SaveBmp(const char* bmpName,unsigned char *imgBuf,int width,int height,int biBitCount)//图像存储
{
if(!imgBuf)//假设没有像素数据传入,则函数返回
return 0;
INewLineByte = (width * biBitCount/8+3)/4*4;//计算新图像每行字节数。/4*4以保证是4的倍数
FILE *fp = fopen(bmpName,"wb");//以二进制方式写文件
if(fp == 0)
return 0;
BITMAPFILEHEADER fileHead;//申请位图文件头结构变量,填写文件头信息
fileHead.bfType= 0x4d42;//bmp类型
fileHead.bfSize = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+ INewLineByte *height;//位图文件大小
fileHead.bfReserved1 = 0;//保留字
fileHead.bfReserved2 = 0;//保留字
fileHead.bfOffBits = 54;//文件头到实际的位图数据的偏移字节数。前三个部分字节数之和
fwrite(&fileHead,sizeof(BITMAPFILEHEADER),1,fp);//将新图像数据写入文件,获取数据地址fileHead,单个元素大小文件头大小,元素个数1个,输入流fp
BITMAPINFOHEADER head;//定义位图信息头结构变量,存放在变量head中
head.biBitCount = biBitCount;//24位
head.biClrImportant = 0;//位图显示过程中重要的颜色数,觉得全部的颜色都是重要的
head.biClrUsed = 0;//位图实际用到的颜色数为2的biBitCount次幂
head.biCompression = 0;//位图压缩类型
head.biHeight = height;//新图像高
head.biPlanes =1;//目标设备的级别
head.biSize = 40;//本结构体长度
head.biSizeImage = ILineByte *height;//实际的位图数据占用的字节数
head.biWidth = width;//新图像宽
head.biXPelsPerMeter = 0;//指定目标设备的水平分辨率
head.biYPelsPerMeter = 0;//指定目标设备的垂直分辨率
fwrite(&head,sizeof(BITMAPINFOHEADER),1,fp);//写入信息头
fwrite(imgBuf,height * INewLineByte,1,fp);//写入像素数据
fclose(fp);//关闭文件
return 1;
} int Zoom(const char* readPath )//图像缩放
{
char address[50];
ReadBmp(readPath);//读取图像
INewWidth = (int) ((IWidth * zoomnumber) +0.5);//新图像的宽度。此处加0.5是因为强制转换时不四舍五入,而是直接截去小数部分
INewHeight = (int) (IHeight * zoomnumber +0.5);//新图像的高带。此处加0.5是因为强制转换时不四舍五入,而是直接截去小数部分
ILineByte =(IWidth*biBitCount/8+3)/4*4;//原图像每行字节数
INewLineByte = (INewWidth * biBitCount/8+3)/4*4;//新图像每行字节数
pINewBuf = new unsigned char [INewLineByte * INewHeight];//定义一个矩阵用以存放新图像像素信息,pIBuf指向首地址 LONG i; //循环变量(像素在新图像中的坐标)
LONG j;
LONG k; //色彩选择,k=0时为蓝色,k=1时为绿色,k=2时为红色
LONG i0; //像素在原图像中的坐标
LONG j0; if(biBitCount == 24)
{
for(i = 0;i < INewHeight;i++)
{
for(j = 0; j < INewWidth;j++)
for(k=0;k<3;k++)
{
i0 = (int)(i/zoomnumber+0.5);
j0 = (int)(j/zoomnumber+0.5);
if((j0 >= 0) && (j0 < IWidth) && (i0 >=0)&& (i0 <IHeight))
{
*(pINewBuf+i*INewLineByte+j*3+k) = *(pIBuf+i0*ILineByte+j0*3+k);//最邻近插值
}
else
{
*(pINewBuf+i*INewLineByte+j*3+k)=255;
}
}
}
}
printf("输入bmp图像缩放后需保存的路径名称和后缀:");
gets(address);
SaveBmp(address,pINewBuf,INewWidth,INewHeight,biBitCount);//调用SaveBmp函数保存图像
delete []pINewBuf;//清除指针
return 1;
} void main()
{
char filepath[256];
printf("请输入bmp图片路径,名称和后缀:(如E:\1.bmp)");
scanf("%s",filepath);
ReadBmp(filepath);//调用ReadBmp函数
printf("请输入所要缩放的倍数(小于1为缩小,大于1为放大):");
scanf("%f",&zoomnumber);getchar();
Zoom(filepath);
}
验证下面图片效果还能够。
BMP的图像处理的更多相关文章
- c语言数字图像处理(一):bmp图片格式及灰度图片转换
本篇文章首先介绍了bmp图片格式,主要参考wiki上的内容,包括bmp文件的存储方式,对于一些常见的bmp文件格式都给了例子,并且对8位 16位RGB555 16位RGB565格式的bmp文件进行了简 ...
- 图像处理笔记(1): bmp文件结构处理与显示
1.1图和调色板的概念 如今Windows(3.x以及95,98,NT)系列已经成为绝大多数用户使用的操作系统,它比DOS成功的一个重要因素是它可视化的漂亮界面.那么Windows是如何显示图象的呢? ...
- 用最简单的方式在C#中使用多线程加速耗时的图像处理算法的执行(多核机器)。
图像处理中,有很多算法由于其内在的复杂性是天然的耗时大户,加之图像本身蕴涵的数据量比一般的对象就大,因此,针对这类算法,执行速度的提在很大程度上依赖于硬件的性能,现在流行的CPU都是至少2核的,稍微好 ...
- C#中使用FreeImage库加载Bmp、JPG、PNG、PCX、TGA、PSD等25种格式的图像(源码)。
其实我一直都是喜欢自己去做图像格式的解码的(目前我自己解码的图像格式大概有15种),但是写本文主要原因是基于CSDN的这个帖子的: http://bbs.csdn.net/topics/3905104 ...
- VB.NET中图像处理的一些技巧以及其和C#图像处理的差距。
早期的时候我使用的开发工具是VB6,VB6做图像处理的速度在我的软件Imageshop中有所体现,还是算可以的.目前,我已经改用C#来研究图像算法,C#中有指针,做图像处理起来效率确实要高不少.VB. ...
- 图像处理工具V1.0
图像处理工具V1.0(仿彗星图片处理工具.VS2015安装界面)----个人无聊作品 以下是界面: 部分代码一.(摘自网络----加水印代码): public static void ImageWat ...
- HTML5图形图像处理技术研究
摘要:图形图像处理平台大部分是传统的C/S架构的桌面应用程序,维护困难,共享性差,而B/S架构的Web程序具有易维护.易共享的优点.本文研究了基于HTML5的Web图形图像处理技术,用HTML5实现了 ...
- 图像处理中的matlab使用
图像的矩阵表示 类和图像类型 虽然使用的是整数坐标, 但 MATLAB 中的像素值(亮度)并未限制为整数. 表 1-1 列出了 MATLAB 和图像处理工具箱为描述像素值而支持的各种类. 表中的前 8 ...
- 基于小波变换的数字图像处理(MATLAB源代码)
基于小波变换的数字图像处理(MATLAB源代码) clear all; close all; clc;M=256;%原图像长度N=64; %水印长度[filename1,pathname]=uiget ...
随机推荐
- Java提要
一.四种权限修饰符 1.访问控制修饰符 作用: 用于控制被修饰变量.方法.类的可见范围. public 的访问级别是最高的,其次是 protected.默认和 private. 成员变量和成员方法可以 ...
- 三维卷积:全景图像Spherical CNNs(Code)
卷积神经网络(CNN)可以很好的处理二维平面图像的问题.然而,对球面图像进行处理需求日益增加.例如,对无人机.机器人.自动驾驶汽车.分子回归问题.全球天气和气候模型的全方位视觉处理问题. 将球形信号的 ...
- 基于 CentOS 搭建Seafile个人网盘
一.安装 Seafile 安装依赖环境使用 yum 安装 Python 及 MySQL: yum install python python-setuptools python-imaging pyt ...
- 扩增子分析解读2提取barcode 质控及样品拆分 切除扩增引物
本节课程,需要完成扩增子分析解读1质控 实验设计 双端序列合并 先看一下扩增子分析的整体流程,从下向上逐层分析 分析前准备 # 进入工作目录 cd example_PE250 上一节回顾:我们拿到了双 ...
- GC策略
JVM里的GC(Garbage Collection)的算法有很多种,如标记清除收集器,压缩收集器,分代收集器等等,详见HotSpot VM GC 的种类 现在比较常用的是分代收集(ge ...
- 【前端路由】Vue-router 中hash模式和history模式的区别
咱们今天说说VUE路由的hash模式与history模式的区别,这个也是面试常问的问题,不要小看这道题其实问到这里的时候那个面试官应该是个大牛,开发经验丰富,这个题其实就是考验你的开发经验是否属实. ...
- zabbix web监控
深入浅出Zabbix 3.0 -- 第十章 Web 监控 http://www.mamicode.com/info-detail-1824545.html
- Invalid character found in the request target.The valid characters are defined in RFC 7230 and RFC3986
Tomcat在 7.0.73, 8.0.39, 8.5.7 版本后,添加了对于http头的验证. 具体来说,就是添加了些规则去限制HTTP头的规范性 参考这里 具体来说: org.apache.tom ...
- Linux kernel-汇编基础
mov ASSEMABLE C LANGUAGE movl %eax,%edx edx = eax; --->register mode movl $0x123,%edx edx = 0x123 ...
- NAT、NAPT(PAT)的基本概念和工作原理及区别
转自:http://blog.sina.com.cn/s/blog_5d302bd20100gprv.html 近年来,随着 Internet 的迅猛发展,连入 Internet 的主机数量成倍增长. ...