首页 > 技术文章 > 任何大小的bmp格式图片打马赛克

hukblog 2018-08-27 16:52 原文

  首先是头文件里面的内容:
主要采用了一个结构体可以自动获取图片的信息。
#ifndef _MASAIKE_H
#define _MASAIKE_H
typedef unsigned int u32;
typedef unsigned short u16;
typedef unsigned char u8;
#pragma pack(1) /*取消字节对齐*/
typedef struct {            /* bmp图片文件头信息封装 */
    /* 位图文件头 */
    u8  bit_file_type[2];   /* 位图文件类型:'BM'->0x4d42 */
    u32 file_size;          /* 整个文件大小 */
    u16 reserved1;          /* 保留 */
    u16 reserved2;          /* 保留 */
    u32 offset;             /* 文件头到位图数据之间的偏移量 */
    /* 位图信息头 */
    u32 head_size;          /* 位图信息头长度 */
    u32 width;              /* 位图宽度 */
    u32 height;             /* 位图高度 */
    u16 bit_planes;         /* 位图位面数 */
    u16 bits_per_pixel;     /* 每个像素的位数 */
    u32 compression;        /* 压缩说明 */
    u32 image_size;         /* 位图数据大小 */
    u32 h_res;              /* 水平分辨率 */
    u32 v_res;              /* 垂直分辨率 */
    u32 color_palette;      /* 位图使用的颜色索引数 */
    u32 vip_color;          /* 重要的颜色索引数目 */
}bmp_head_t;
void FS_MaGetpic(int);
void FS_MaSaiKe(int);
#endif
 
 
然后是.c文件里面的内容,主要采用了两个函数一个函数获取图片大小,一个函数用来打马赛克。
#include<stdio.h>
#include<stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "masaike.h"
#include "type.h"
static int g_mskWidth,g_mskHeight,g_mskHeadSize;
static short g_mskBite;
/*获取图片的信息*/
void FS_MaGetpic(int fp)
{
    bmp_head_t header;              /*图片信息结构体*/
    read(fp,&header,sizeof(header));/*将图片里面的内容读到结构体中*/
    printf("with = %d\n", header.width);
    printf("height = %d\n", header.height);
    printf("bits_per_pixel = %hd\n", header.bits_per_pixel);
    printf("headsize = %d\n",header.head_size);
    g_mskWidth = header.width;        /*图片宽度*/
    g_mskHeight = header.height;      /*图片长度*/
    g_mskHeadSize = header.head_size; /*图片的头长度*/
    g_mskBite = header.bits_per_pixel;/*每个像素的位数*/
}
/*打马赛克*/
void FS_MaSaiKe(int fp)
{
    int g_mskXoff,g_mskYoff,g_Width,g_Higth;
    int i,j,k,g_mskoffset;
    char pix[g_mskBite/8];
    printf("please set X Y W H:\n");/*输入 x y 宽和高*/
    scanf("%d %d %d %d",&g_mskXoff,&g_mskYoff,&g_Width,&g_Higth);
    g_mskXoff = g_mskHeight - g_mskXoff;
    g_mskYoff = g_mskWidth - g_mskYoff;
   
    printf("%d  %d\n",g_mskXoff,g_mskYoff);
    for(i=g_mskXoff;i>g_mskXoff-g_Higth;i--)    /*打码*/
    {
        for(j=g_mskYoff;j>g_mskYoff-g_Width;j--)
        {
            g_mskoffset = g_mskHeadSize+(i*g_mskWidth-j)*(g_mskBite/8);
            lseek(fp,g_mskoffset,SEEK_SET);
            for(k=0;k<g_mskBite/8;k++)
            {
                pix[j] = pix[j+k];// random();
                write(fp,&pix[j],1);
            }
        }
    }
    sleep(1);
    printf("*---------------------------------------*\n*\n");
    printf("*正在玩命打码.........\n*\n");
    printf("*---------------------------------------*\n");
    sleep(3);
    printf("打码成功\n");
}

int main()
{
    char *path =(char*)malloc(20);
    printf("please input pic name:\n");
    gets(path);
        int fp = open(path,O_RDWR,0664);
    if(fp < 0)
    {
        perror("open");
        exit(EXIT_FAILURE);
    }
    FS_MaGetpic(fp);
    FS_MaSaiKe(fp);
    close(fp);:
    return FS_OK;
}
 
原创作品,未经允许不得转载,原创人:多多指教吧。

推荐阅读