📄 zf.c
字号:
#include <stdio.h>#include <stdlib.h>#include <memory.h>#include "hdr.h"struct bmphdr *hdr;unsigned char *bitmap, new_color[256];int count[256], acum[256], count_new[256];int main(int argc, char *argv[]){ int i, j, k, nr_pixels; FILE *fp, *fpnew; if (argc != 3) { printf("Usage: %s <file_from> <file_to>\n", argv[0]); exit(1); } hdr = get_header(argv[1]); if (!hdr) exit(1); fp = fopen(argv[1], "rb"); if (!fp) { printf("File open error!\n"); exit(1); } fseek(fp, hdr->offset, SEEK_SET); nr_pixels = hdr->width * hdr->height; bitmap = malloc(nr_pixels); fread(bitmap, nr_pixels, 1, fp); fclose(fp); memset(count, 0, sizeof(count)); for (i = 0; i < nr_pixels; i++) { j = 0; count[(j | bitmap[i])]++; } memcpy(acum, count, sizeof(acum)); for (i = 1; i < 256; i++) acum[i] += acum[i-1]; memset(count_new, 0, sizeof(count_new)); for (i = 0; i < 256; i++) { j = acum[i] * 256 / nr_pixels; if (j > 255) j = 255; new_color[i] = *(unsigned char*)(&j); count_new[j] += count[i]; } /* for (i = 0; i < 256; i++) printf("%d:\t%d\t%d\n", i, count[i], count_new[i]); for (i = 0; i < 256; i++) printf("%d\t-->\t%d\n", i, new_color[i]); */ for (i = 0; i < nr_pixels; i++) bitmap[i] = new_color[bitmap[i]]; fpnew = fopen(argv[2], "wb+"); if (fpnew < 0) { printf("File create error!\n"); exit(1); } fwrite(hdr->signature, 2, 1, fpnew); fwrite(&hdr->size, 4, 1, fpnew); fwrite(hdr->reserved, 4, 1, fpnew); fwrite(&hdr->offset, 4, 1, fpnew); fwrite(&hdr->hdr_size, 4, 1, fpnew); fwrite(&hdr->width, 4, 1, fpnew); fwrite(&hdr->height, 4, 1, fpnew); fwrite(&hdr->nr_planes, 2, 1, fpnew); fwrite(&hdr->bits_per_pixel, 2, 1, fpnew); fwrite(&hdr->compress_type, 4, 1, fpnew); fwrite(&hdr->data_size, 4, 1, fpnew); fwrite(&hdr->resol_hori, 4, 1, fpnew); fwrite(&hdr->resol_vert, 4, 1, fpnew); fwrite(&hdr->nr_colors, 4, 1, fpnew); fwrite(&hdr->important_color, 4, 1, fpnew); if (hdr->offset > 54) fwrite(hdr->info, (hdr->offset - 54), 1, fpnew); fwrite(bitmap, nr_pixels, 1, fpnew); fclose(fpnew); free(hdr); free(bitmap); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -