24位位图bmp转换为字符

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <stdint.h>
 4 #include <windows.h>
 5 int32_t width,height;
 6 RGBQUAD *pixels;
 7 bool OpenBitmap(char const *filename)
 8 {
 9     FILE *file = fopen(filename, "rb");
10     if (file)
11     {
12         width=0;
13         height=0;
14         BITMAPFILEHEADER bf;
15         BITMAPINFOHEADER bi;
16         fread(&bf, sizeof(bf), 1, file);
17         fread(&bi, sizeof(bi), 1, file);
18         if(bi.biBitCount!=24)
19             return false;
20         if(bi.biCompression!=BI_RGB)
21             return false;
22         width=bi.biWidth;
23         height=bi.biHeight;
24         pixels=new RGBQUAD[width*height];
25         uint32_t rowSize = (bi.biBitCount * width + 31) / 32 * 4;
26         uint8_t *line = new uint8_t[rowSize];
27         for (int y = 0; y < height; y++)
28         {
29             fread(line, rowSize, 1, file);
30             for (int x = 0; x < width; x++)
31             {
32                 uint8_t *color = line + x * 3;
33                 RGBQUAD *pixel = &pixels[(height-y-1) * width+x];
34                 pixel->rgbBlue  = color[0];
35                 pixel->rgbGreen = color[1];
36                 pixel->rgbRed   = color[2];
37             }
38         }
39         delete[] line;
40         fclose(file);
41         return true;
42     }
43     return false;
44 }
45 RGBQUAD GetColor(int x, int y, int w, int h)
46 {
47     int r = 0, g = 0, b = 0;
48     for (int i = 0; i < w; i++)
49     {
50         if (i + x >= width) continue;
51         for (int j = 0; j < h; j++)
52         {
53             if (j + y >= height) continue;
54             RGBQUAD const& color = pixels[(y + j) * width + (x + i)];
55             r += color.rgbRed;
56             g += color.rgbGreen;
57             b += color.rgbBlue;
58         }
59     }
60     return RGBQUAD{r / (w * h), g / (w * h),b / (w * h)};
61 }
62 char ColorToCharacter(RGBQUAD const& color)
63 {
64     int brightness = (color.rgbRed + color.rgbGreen + color.rgbBlue) / 3;
65     static char const *characters = "Qo0V1;:*-. ";
66     int count = strlen(characters);
67     int span = 0xFF / count;
68     int cidx = brightness / span;
69     if (cidx == count)
70         cidx--;
71     return characters[cidx];
72 }
73 void OutputAscii(const char* filename, int w, int h)
74 {
75     FILE *file=fopen(filename,"w");
76     int x = width  / w;
77     int y = height / h;
78     for (int i = 0; i < height; i += y)
79     {
80         for (int j = 0; j < width; j += x)
81         {
82             RGBQUAD color = GetColor(j, i, x, y);
83             fprintf(file, "%c", ColorToCharacter(color));
84             //printf("%c", ColorToCharacter(color));
85         }
86         fprintf(file, "\n");
87         //printf("\n");
88     }
89 }
90 int main()
91 {
92     if(OpenBitmap("a.bmp"))
93         OutputAscii("a.txt",width/6,height/12);
94     return 0;
95 }
时间: 2024-09-30 07:35:51

24位位图bmp转换为字符的相关文章

C语言和OpenGL实现的24位色BMP解码器

我突然很喜欢发明轮子.. 早就想实现一下图片解码器和声音解码器. bmp的图片没有压缩,解码最简单,今天下午研究了一下bmp的编码,然后写了个24位色的解码器.(24位色的bmp没有调色板,8位和16位都有). 代码很简单,直接就能看懂,所以不说很多,直接贴了.. 1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include <stdio.h> 4 #include <Windows.h> 5 #include <gl/freeglut.h&g

为什么24位位图(真彩色)的biSizeImage不等于(biWidth*biBitCount+31)/32*4*biHeight?

规定的,规定BMP文件的像素数据是按行存储的,而且每行的字节数必须为4的倍数,如果实际的像素数据不是4的倍数咋办?这就需要字节对齐,对齐是在一行的末尾添0以补足一行的字节数为4的倍数, ( biWidth*biBitCount+31)/32*4*biHeight//其中 biWidth是图像的宽度以像素为单位,biBitCount是每个像素的位数,如黑白图像(不是灰阶的,要么黑色要么白色)为1个像素1位,16色是4位,真彩色是24位......biHeight是指图像的高度( biWidth*b

bmp文件格式中rgb555与rgb888之间的转换,24位与16位位图的转换

今日,有同事问我,rgb555模式下的位图文件的格式问题,于是花了一下午的时间通过猜测与测试,分析出了如下bmp文件在rgb555模式下的文件存储规律: 1:bmp文件的文件信息头中的biBitCount数据应该为16 在rgb555模式下,一个像素占用2字节,rgb分别占用5位,另外有一位是填充位. 2:16位数据的组成如下 第一个字节:g5g4g3b7b6b5b4b3 第二个字节:0r7r6r5r4r3g7g6 其中第二个字节的左边第一位为填充位,我在实验中用0填充. 3:该16位bmp图像

【数字图像】C++8位和24位BMP位图的平滑、锐化、二值化处理,以及24位真彩图的灰度化

头文件: typedef unsigned char BYTE; typedef unsigned short WORD; typedef unsigned int DWORD; typedef long LONG; //BMP文件头(14字节) typedef struct tagBITMAPFILEHEADER { //WORD bfType;//位图文件的类型,必须为BM(在结构体中读取会发生错误,所以在函数中读取) DWORD bfSize;//位图文件的大小,以字节为单位 WORD b

如何将24位RGB颜色转换16位RGB颜色

有许多朋友第一次使用16位彩色显示屏会遇到如何将24位RGB颜色转换为对应的16位RGB颜色的问题,通过查阅相关资料,就写一下其中的转换原理吧,希望对大家会有所帮助. 我们知道24位RGB是分别由8位红色,8位绿色以及8位蓝色组成: RRRRRRRR GGGGGGGG BBBBBBBB 例如:24位RGB红色表示方法为 11111111 00000000 00000000        (十六进制表示为:0xFF0000) 而对应的16位RGB颜色则是由5位红色,6位绿色以及5位红色组成: RR

24位bmp彩色图转换为24位灰度图的方法

一.所用到的流处理函数: fstream:可同时进行读写操作的文件类:或 ofstream:写操作(从内存中读数据到文件)的文件类: ifstream:读操作(从文件读数据到内存)的文件类. 二.位图文件的格式: ① 位图文件头,所用结构体:BITMAPFILEHEADER,占14个字节 ② 位图信息头,所用结构体:BITMAPINFOHEADER,占40个字节 ③ 颜色表项,所用结构体:RGBQUAD,由biBitCount值决定 ④ 数据区,当结构体BITMAPINFOHEADER中的成员变

C/C++ BMP(24位真彩色)图像处理(4)------图像の旋转

历经一个多月,CSDN貌似终于好像把文章列表阅读量信息归零BUG给修好了,于是乎放篇做期末大作业时写的文章上来测测效果,可别又像上次一样一发文章就又坑爹了啊! 本篇谈的是图像的旋转,不算是什么新鲜的题目了.但是现在由于很多工具如MATLAB.OPENCV等都把算法写好给用户调用,导致大多用户只知其然不知其所以然,所以回顾一下也是好的. 图像的旋转,说到底就是每个像素点绕着某个圆心旋转一定角度.如果是写代码的话,旋转的角度和圆心应该是已知的条件,我们第一个思路是根据已知条件求取出图像经过旋转后的新

关于Opengl中将24位BMP图片加入?一个alpha通道并实现透明的问题

#include <windows.h>#include <GL/glut.h>#include <GL/glaux.h>#include <stdio.h> #pragma comment( lib, "opengl32.lib" )// 链接时使用OpenGL32.lib#pragma comment( lib, "glu32.lib" )// 链接时使用GLu32.lib  #pragma comment( li

BMP位图之1位位图(一)

起始结构 typedef struct tagBITMAPFILEHEADER { WORD bfType; //类型名,字符串"BM", DWORD bfSize; //文件大小 WORD bfReserved1; //保留字 WORD bfReserved2; //保留字 DWORD bfOffBits; //实际位图数据的偏移字节数,即前三个部分长度之和 } BITMAPFILEHEADER; 对应数据 WORD bfType : 0x4d42 DWORD bfSize:0x16