bmp格式图片缩放(位图缩放)

article/2025/8/26 2:18:00

bmp位图格式理逐渐地被广泛应用,其格式的特点是包含的图像信息较丰富,几乎不进行压缩。bmp图片由文件头,位图信息头,24位图片以下还有调色板,和图像数据组成。位图的信息头包含下列变量:
在这里插入图片描述
调色板的结构为蓝,绿,红的顺序排列,最后一位为保留项。有了调色板的索引表,在图像数据里就会用索引值表示像素点。图片的实际宽度大小=位图宽度存储每个像素需要的字节数除以4。
在缩放bmp格式的图片时,需要对bmp图片进行读取,设计时,BMP图像用C语言实现图像的缩放。将bmp图片读取后,需要对其格式进行解析,然后对宽度和高度分别放大或缩小一定的尺寸比例,缩放的倍数通过输入设定。代码如下:

#include <Windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>int main(int argc, char ** argv)
{FILE *fp = fopen("C:/Users/23011/Desktop/ttt/input.bmp","rb");if (fp == 0)return 0;BITMAPFILEHEADER fileHead;fread(&fileHead, sizeof(BITMAPFILEHEADER), 1, fp);BITMAPINFOHEADER infoHead;fread(&infoHead, sizeof(BITMAPINFOHEADER), 1, fp);int width = infoHead.biWidth;int height = infoHead.biHeight;int biCount = infoHead.biBitCount;RGBQUAD *pColorTable;int pColorTableSize = 0;pColorTable = new RGBQUAD[256];fread(pColorTable, sizeof(RGBQUAD), 256, fp);pColorTableSize = 1024;unsigned char *pBmpBuf;int lineByte = (width*biCount / 8 + 3) / 4 * 4;pBmpBuf = new unsigned char[lineByte*height];fread(pBmpBuf, lineByte*height, 1, fp);fclose(fp);printf("input the scale");float lx, ly;scanf("%f%f", &lx, &ly);int dstWidth = round(double(lx*width));int dstHeight = round(double(ly*height));int lineByte2 = (dstWidth*biCount / 8 + 3) / 4 * 4;unsigned char*pBmpBuf2;pBmpBuf2 = new unsigned char[lineByte2*dstHeight];for (int i = 0; i < dstHeight; ++i){for (int j = 0; j < dstWidth; ++j){unsigned char *p;p = (unsigned char *)(pBmpBuf2 + lineByte2*i + j);(*p) = 255;}}int x = 0;int y = 0;for (int i = 0; i < height; ++i){for (int j = 0; j < width; ++j){unsigned char *p1, *p2;x = round(double(lx*j));y = round(double(ly*i));p1 = (unsigned char *)(pBmpBuf + i*lineByte + j);p2 = (unsigned char *)(pBmpBuf2 + y*lineByte2 + x);(*p2) = (*p1);}}FILE *fpo = fopen("C:/Users/23011/Desktop/ttt/output.bmp", "wb");if (fpo == 0)return 0;BITMAPFILEHEADER dstFileHead;dstFileHead.bfOffBits = 14 + 40 + pColorTableSize;dstFileHead.bfReserved1 = 0;dstFileHead.bfReserved2 = 0;dstFileHead.bfSize = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+pColorTableSize + lineByte2*dstHeight;dstFileHead.bfType = 0x4D42;fwrite(&dstFileHead, sizeof(dstFileHead), 1, fpo);BITMAPINFOHEADER dstInfoHead;dstInfoHead.biBitCount = biCount;dstInfoHead.biClrImportant = 0;dstInfoHead.biClrUsed = 0;dstInfoHead.biCompression = 0;dstInfoHead.biHeight = dstHeight;dstInfoHead.biPlanes = 1;dstInfoHead.biSize = 40;dstInfoHead.biSizeImage = lineByte2*dstHeight;dstInfoHead.biWidth = dstWidth;dstInfoHead.biXPelsPerMeter = 0;dstInfoHead.biYPelsPerMeter = 0;fwrite(&dstInfoHead, sizeof(BITMAPINFOHEADER), 1, fpo);fwrite(pColorTable, sizeof(RGBQUAD), 256, fpo);fwrite(pBmpBuf2, lineByte2*dstHeight, 1, fp);fclose(fpo);system("pause");return 0;
}

当然,上面的C++代码相当于手撕代码了,纯纯地手动对BMP位图进行缩放,如果没有特殊要求的话,我们还可以直接使用python库进行resize(CV库,Image库都可以~),以Image库为例,代码如下:

from PIL import Image
img = Image.open('DIR')imgSize = img.size
w = img.width
h = img.height
print('Before Resize:\n')
print(imgSize)
print(w, h)out = img.resize((400, 300))
imgSize = out.size
w = out.width
h = out.height
print('======================')
print('After Resize:\n')
print(imgSize)
print(w, h)
out.show()
out.save('DIR')

是不是简单很多了呢😄


http://chatgpt.dhexx.cn/article/oiH95aX6.shtml

相关文章

图片缩放原理

**shape[0] 图像的高 shape[1] 图像的宽 shape[2] 图像的图像通道数量 np.zeros(shape, dtypefloat, order‘C’) 示例&#xff1a; import numpy as np Zero np.zeros(10) print&#xff08;Zero&#xff09; print(Zero.shape) 输出&#xff1a; [0. 0. 0. 0. 0. 0. 0. …

CSS 3之图片缩放

图片缩放 1. 通过标记设置图片大小2. CSS 3中的 width 和 height3. CSS 3 中的 max-width 与 max-height 1. 通过标记设置图片大小 使用 img 的描述标记 height 和 width 能设置图片大小&#xff1b; height 和 width 分别表示图片的高度和宽度&#xff0c;可以是数值或百分比…

1缩放图片

图片缩放 最近临域插值 双线性插值 原理 src(原图像) 1020 dst&#xff08;目标图片&#xff09; 510可以用原图像上的点src表示目标图像上的点dst #例如&#xff1a;原图像的点&#xff08;2,4&#xff09;表示目标图像的点&#xff08;1,2&#xff09;知道目标图像&#xf…

CSS学习37:图片缩放

语法&#xff1a; 1、x y 单独设置 transform: scale(x轴缩放倍数, y轴缩放倍数); 2、统一设置 transform: scale(缩放倍数); 一般情况下, 只为scale设置一个值, 表示x轴和y轴等比例缩放 transform: scale(缩放倍数); scale值大于1表示放大, scale值小于1表示缩小 案例效果&a…

【图片resize】图片三种缩放方式/letterbox_image实现

文章目录 1 总体简介2 实现效果2.1 直接缩放&#xff0c;不怕变形2.2 不变形缩放/letterbox_image2.2.1 不变形缩放&#xff0c;两端填充灰边2.2.2 不变形缩放&#xff0c;一端填充灰边 3 代码运行 1 总体简介 对图像进行预处理操作的时候&#xff0c;一般有两种缩放方式。 一…

正在解析主机 nginx.org... 失败:域名解析暂时失败。 wget: 无法解析主机地址 “nginx.org”

在安装Nginx的时候遇到如下的问题 正在解析主机 nginx.org… 失败&#xff1a;域名解析暂时失败。 wget: 无法解析主机地址 “nginx.org” 命令如下&#xff1a; [rootlocalhost local]# wget http://nginx.org/download/nginx-1.12.2.tar.gz开始以为是官网不能下载&#xff0c…

安装虚拟机后,主机浏览器访问变慢,显示正在解析主机问题

先找到 控制面板 点击 查看网络状态和任务 选 更改适配器设置 双击它 点 属性 双击第四个选项 都改成自动获取。

CentOS wget命令: 无法解析主机地址 域名解析失败

再使用wget命令中redis.io下载Redis安装包时候报错如下&#xff1a; 百度了许多方法都没有解决&#xff0c;综合各种方式以后&#xff0c;终于给解决了这个问题。方法如下&#xff1a; 首先使用 ifconfig命令查看你的IP地址&#xff0c;如果是这种状态就需要去手动添加 在你的…

问题:正在解析主机 XXX失败:未知的名称或服务。wget: 无法解析主机地址 “XXX”

问题&#xff1a;新安装的ubuntu16.04使用wget命令拉取llvm安装包出错 解决方法&#xff1a; 修改DNS即可 sudo vim /etc/resolv.conf #修改nameserver 127.0.1.1 为 8.8.8.8

wget无法解析主机地址

备份恢复机检查配置好网卡信息后,wget包显示无法解析主机地址 排查过程 ping 外网地址不通 ping 外网IP通 定位可能解析有问题 查看解析服务器信息并修改恢复 vim /etc/sysconfig/network-scripts/ifcfg-eth0 //编辑网络信息 vim /etc/resolv.conf //编辑解析地址 总结&#x…

配置在线 YUM 源仓库时 wget 无法解析主机地址

文章目录 一、现象二、解决 一、现象 配置在线源时&#xff0c;第一步将在线 YUM 源配置文件下载到本地我就卡住了&#xff0c;如下所示&#xff1a; [rootlocalhost ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo --2021-0…

wget报错处理无法解析主机或者无反应

[rootlocalhost ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo --2022-12-02 16:57:26-- http://mirrors.aliyun.com/repo/Centos-7.repo 正在解析主机 mirrors.aliyun.com (mirrors.aliyun.com)... 失败&#xff1a;未知的名…

win10如何解决浏览器出现“正在解析主机”的问题,很大原因是虚拟机,虚拟网卡,小米随身wifi导致的,DNS优选下载,

如何解决浏览器出现“正在解析主机”的问题 ,很大原因虚拟机,虚拟网卡,小米随身wifi导致的 方法(一) 1. 把所有的全部禁止; 1.1 很大原因是虚拟网卡导致的,或卸载对应的虚拟机 2. 小米随身WiFi 也是导致网络慢的原因,把小米随身WiFi 拔下来,关点软件;或卸载驱动软件 如果还不行…

CentOS 7 下载yum源报错:正在解析主机 mirrors.aliyun.com (mirrors.aliyun.com)... 失败:未知的名称或服务。

下载yum源报错&#xff1a;未知的名称或服务解决方法 错误信息解决方法 错误信息 正在解析主机mirrors.aliyun.com (mirrors.aliyun.com)… 失败&#xff1a;未知的名称或服务。wget: 无法解析主机地址“mirrors.aliyun.com” 解决方法 解决方法 &#xff1a; 登录root用户…

主机名解析

主机名解析&#xff0c;比如&#xff1a;本地系统将域名(wenlong.wen.com)转换为IP地址(192.168.x.x) ①Unix初期&#xff0c;域名解析很容易&#xff0c;当时计算机网络有4个主机&#xff0c;其中每个主机的名称和地址都放在/etc/hosts这个静态数据库中 ②如今&#xff0c;网…

正在解析主机,路由器打不开个别网页,已解决

在连接路由器的情况下,无论上无线上网,还是网线与路由器直接相连,360浏览器左下角都会经常显示正在解析主机,个别网站能打开,个别网站,有时能打开,有时怎么搞也不行.一般反复重启路由器可以暂时解决问题. 关于通常的解决方案,一般无效: 360急救箱, 重启本地连接或无线连接,重…

正在解析主机 mirrors.aliyun.com (mirrors.aliyun.com)... 失败:未知的名称或服务。wget: 无法解析主机地址 “mirrors.aliyun.com”

找到如下配置文件&#xff1a;/etc/resolv.conf vim /etc/resolv.conf 添加如下源地址&#xff1a; nameserver 8.8.8.8 nameserver 8.8.4.4 nameserver 223.5.5.5 nameserver 223.6.6.6 保存退出。就可以下载啦&#xff01;

浏览器正在解析主机时间过长及网页加载时间过长的问题

问题1 解析主机时间长 hosts文件乱了&#xff0c;直接全删了,保存就行使用虚拟机后&#xff0c;打开网页一直在解析主机非常慢&#xff0c;将下面的虚拟机网络适配器VMnet8关闭即后打开网页飞快 问题2 打开网页转圈时间长 很有可能打开了百度网盘下载东西&#xff0c;我个人…

正在解析主机……失败:未知的名称或服务,wget无法解析主机地址。

无法解析主机地址 在centos7系统中安装python3时出现&#xff1a;无法解析主机地址问题。 当在终端中输入&#xff1a; wget https://www.python.org/ftp/python/3.7.4/Python-3.7.4.tar.xz出现 正在解析主机 www.python.org (www.python.org)… 失败&#xff1a;未知的名称…

linux解析主机域名失败,centos无法解析主机域名

centos无法解析主机域名,主机,视频教程,教程,解决方法,长度 centos无法解析主机域名 易采站长站&#xff0c;站长之家为您整理了centos无法解析主机域名的相关内容。 问题还原&#xff1a; 正在解析主机 cdn.openbsd.org (cdn.openbsd.org)... 失败&#xff1a;域名解析暂时失败…