首页 > 其他分享 >实现bmp格式图片的2倍缩小功能,并输出新的目标bmp格式文件。最后利用800*480的开发板,展示缩放后的bmp文件

实现bmp格式图片的2倍缩小功能,并输出新的目标bmp格式文件。最后利用800*480的开发板,展示缩放后的bmp文件

时间:2024-05-13 21:53:28浏览次数:14  
标签:缩放 int S2 unsigned 格式文件 bmp MUL 图片

/********************************************************************************************************
*
*
* 实现bmp格式图片的2倍缩小功能,并输出新的目标bmp格式文件。最后利用800*480的开发
* 板,展示缩放后的bmp文件
*
*
*
* Copyright (c)  2023-2024   [email protected]   All right Reserved
* ****************************************************************************


#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
#include <sys/ioctl.h>
#include <linux/fb.h>
#include <stdlib.h>

#define MUL 2 // 规定缩放倍数,多重倍数需后续笔者继续优化

#pragma pack(1)                    // 取消默认字节对齐
typedef struct tagBITMAPFILEHEADER // bmp格式图片的文件信息头1
{
    unsigned short type;      // 文件标识,字母编码“BM”
    unsigned int size;        // 位图文件大小,以字节为单位
    unsigned short reserved1; // 位图文件保留字,为0
    unsigned short reserved2; // 位图文件保留字,为0
    unsigned int offBits;     // 文件开始到位图数据开始自建的偏移量,单位字节
} BMF_HEADER;

typedef struct tagBITMAPINFOHEADER // bmp格式图片的文件信息头2
{
    unsigned int biSize;         // 图像描述信息块大小,常为28H
    int width;                   // 图像宽度
    int height;                  // 图像高度
    unsigned short biPlanes;     // 图像plane总数(恒为1)
    unsigned short biBit_depth;  // 记录颜色的位数取值1
    unsigned int biCompression;  // 数据压缩方式
    unsigned int biSizeImage;    // 图像区数据的大小,必须是4的倍数
    int biXPelsPerMeter;         // 水平每米像素
    int biYPelsPerMeter;         // 垂直每米像素
    unsigned int biClrUsed;      // 图像所用颜色素,不用,固定为0
    unsigned int biClrImportant; // 重要颜色数,不用,固定为0
} BMFI_HEADER;
#pragma pack() // 恢复默认字节对齐

int main(int argc, char *argv[])
{
    // 1.打开源图片文件,并进行信息提取
    BMF_HEADER S1;
    BMFI_HEADER S2;                       // 用于头文件信息提取
    FILE *bmp_fp = fopen(argv[1], "rb+"); // 打开源图片文件
    if (argc != 3)                        // 错误判断
    {
        printf("Usage:%s <srcfile><dstfile>\n", argv[0]);
        exit(1);
    }
    if (!bmp_fp) // 错误判断
    {
        perror("fopen()");
        exit(1);
    }
    fread(&S1, 1, 14, bmp_fp); // 进行源图片的头文件信息提取
    fread(&S2, 1, 40, bmp_fp);

    int bmp_size = S2.width * S2.height * S2.biBit_depth / 8;
    char bmp_buf[bmp_size];              // 申请空间,存放源图片信息
    fread(bmp_buf, 1, bmp_size, bmp_fp); // 读取图片文件信息
    fclose(bmp_fp);                      // 关掉源图片文件

    // 2.进行源图片的数据处理
    char newbuf[bmp_size / MUL / MUL]; // 申请数组,存放重新采样后的图片信息
    int cnt = 0;
    for (int y = 0; y < S2.height; y += MUL) // 存放按倍数缩放采样后的图片信息,每次前进MUL个像素点
    {
        for (int x = 0; x < S2.width; x += MUL)
        {
            newbuf[cnt++] = bmp_buf[(y * S2.width + x) * 3];     // B
            newbuf[cnt++] = bmp_buf[(y * S2.width + x) * 3 + 1]; // G
            newbuf[cnt++] = bmp_buf[(y * S2.width + x) * 3 + 2]; // R
        }
    }

    // 3.创建新的图片文件,并存入相关信息
    FILE *new_fp = fopen(argv[2], "wb+"); // 创建新的图片文件
    if (!new_fp)                          // 错误判断
    {
        perror("fopen()");
        exit(1);
    }
    S2.width = S2.width / MUL;
    S2.height = S2.height / MUL;
    fwrite(&S1, 1, 14, new_fp); // 往新的图片文件写进内容;先写头1
    fwrite(&S2, 1, 40, new_fp); // 往新的图片文件写进内容;写头2
    fwrite(&newbuf, 1, bmp_size / MUL / MUL, new_fp);
    fclose(new_fp);

    // 4.打开LCD设备操作,并申请映射空间
    int lcd_fd = open("/dev/fb0", O_RDWR); // 打开LCD设备
    int *lcd_map = (int *)mmap(NULL,
                               800 * 480 * 4, // 申请映射空间,此处一定要是设备的尺寸
                               PROT_READ | PROT_WRITE,
                               MAP_SHARED,
                               lcd_fd,
                               0);
    // 5.设置图片位置偏移量,并将图片信息写入映射内存
    int X, Y;
    printf("Please enter the location(X Y):\n"); // X和Y是相对于左上角点的位置,让用户输入
    scanf("%d %d", &X, &Y);
    int i = 0;
    int data = 0;
    for (int y = S2.height / MUL - 1; y >= 0; y--) // 此处要写新图片的尺寸,以完整的输入整张图片信息
    {
        for (int x = 0; x < S2.width / MUL; ++x)
        {
            // 把BMP图片的一个像素点的颜色分量转换为LCD屏幕的一个像素点的颜色分量格式  ARGB <--- BGR
            data |= newbuf[i];                     // B
            data |= newbuf[i + 1] << 8;            // G
            data |= newbuf[i + 2] << 16;           // R
            lcd_map[800 * (y + Y) + x + X] = data; // 此处要写LCD屏幕的高度
            i += 3;
            data = 0;
        }
    }
    close(lcd_fd);
    munmap(lcd_map, 800 * 480 * 4); // 此处要写LCD屏幕的尺寸
    return 0;
}

标签:缩放,int,S2,unsigned,格式文件,bmp,MUL,图片
From: https://www.cnblogs.com/CamelliaWY/p/18190121

相关文章

  • 将bmp文件转换成JPEG(待修改,目前可转换但图片倒转)
    #include<stdio.h>#include<stdlib.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<unistd.h>#include<sys/mman.h>/**IncludefileforusersofJPEGlibrary.*Youwillneedtoha......
  • 将任意bmp图片大小重新设置后生成新的bmp图片
    #include<stdio.h>#include<stdlib.h>#include<string.h>#pragmapack(1)/*必须在结构体定义之前使用,这是为了让结构体中各成员按1字节对齐*/typedefstructtagBITMAPFILEHEADER{ unsignedshortbfType; //保存图片类型。'BM' unsignedlongbfSize; //位图......
  • BMP格式图片缩放及在LCD屏幕展示练习
    /***@brief:实现bmp格式图片的2倍缩小功能,并输出新的目标bmp格式文件。最后利用800*480的开发板,展示缩放后的bmp文件因为只是进行函数练习,未采用函数封装的做法*@[email protected]*@date2024/05/12*CopyRight(c)2023-2024ni456xinmie@1......
  • 在LCD屏内显示任意尺寸任意大小的bmp图像
    在LCD屏内显示任意尺寸任意大小的bmp图像定义结构体/******************************************************************************filename:ShowBmp.c*author:Dazz*date:2024-05-12*function:在LCD上显示任意大小任意尺寸的bmp图片*note......
  • 获取BMP图片件并在LCD屏上打开
    目录目录获取BMP文件获取信息进行缩放并产生新的BMP文件并在LCD屏上进行显示头文件BMP文件结构体主函数/********************************************************************filename:ChangeBmp.c*author:[email protected]*date:2024-05-12*func......
  • bmp任意大小任意尺寸显示在lcd屏内
    IO编程在LCD屏内显示任意尺寸任意大小的图像/******************************************************************************filename:2024-05-12_ShowBmp.c*author:[email protected]*date:2024-05-12*function:在LCD上显示任意大小任意尺......
  • 自定义函数在LCD上显示一张不超过LCD像素大小的色深为 24bit的bmp图片
    设计程序实现在LCD上任意位置显示一张任意大小的色深为24bit的bmp图片,要求图像不失真可以在开发板的LCD上显示。头文件包含#include<stdio.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<unistd.h>#include<sys/mman.h>#include<linux/......
  • C语言实现获取BMP文件信息
    通过命令行传递文件路径参数,输出BMP的width、height、size1、从BMP的结构信息可知,文件大小、图片宽度、图片高度均占据4个字节,所以只需要打开文件读取对应位置的信息并打印即可。2、为了提高可移植性,可以定义结构体,保持和BMP文件结构一致,这样可以一次性读取保存,方便后续调用。但......
  • 系统IO下查看bmp照片信息
    IO编程用系统IO实现查看bmp照片信息设计程序,利用系统IO读取磁盘上指定BMP图片的宽和高,以及BMP图片的大小,并输出到终端,要求图片名称通过命令行传递。/******************************************************************************filename:2024-05-11_GetBmpInfo.c......
  • GETbmpinfo
    /*************************************************/***@filename: GETbmpinfo*@brief实现对BMP图片位图信息的获取*@[email protected]*@date2024/05/11*@version1.0:在下坂本,有何贵干*@property:none*@notenone*CopyRigh......