在将像素阵列加载到带有填充行的阵列中后,如何填充bmp文件中像素之间的间隙 我用C++编写了一个程序,用SimelVelk Windows函数将BMP图像的像素绘制到控制台,但是在加载像素数组后,图像在像素间打印出了控制台。提前感谢您的帮助
这是控制台上打印图像的输出在将像素阵列加载到带有填充行的阵列中后,如何填充bmp文件中像素之间的间隙 我用C++编写了一个程序,用SimelVelk Windows函数将BMP图像的像素绘制到控制台,但是在加载像素数组后,图像在像素间打印出了控制台。提前感谢您的帮助,c++,arrays,c,bmp,C++,Arrays,C,Bmp,这是控制台上打印图像的输出 // bmp bitmap #include <stdlib.h> #include <stdio.h> #include <windows.h> using namespace std; #pragma pack(1) struct BitmapFileHeader { unsigned short type; unsigned int size; unsigned short reserved1;
// bmp bitmap
#include <stdlib.h>
#include <stdio.h>
#include <windows.h>
using namespace std;
#pragma pack(1)
struct BitmapFileHeader {
unsigned short type;
unsigned int size;
unsigned short reserved1;
unsigned short reserved2;
unsigned int offset;
};
#pragma pack(0)
unsigned char grayScale(unsigned char r, unsigned char g, unsigned char b) {
return ((r + g + b) / 3);
}
int main() {
char *data;
FILE *filePointer;
int **ImageArray;
BitmapFileHeader *bmp = (struct BitmapFileHeader*)malloc(sizeof(struct BitmapFileHeader));
BITMAPINFOHEADER *BitmapInfoHeader = (BITMAPINFOHEADER*)malloc(sizeof(BITMAPINFOHEADER));
HWND console = GetConsoleWindow();
HDC context = ::GetDC(console) ;
filePointer = fopen("tom.bmp", "rb");
if(!filePointer) {
perror("");
}
fread(reinterpret_cast<BitmapFileHeader*>(bmp), sizeof(BitmapFileHeader), 1, filePointer);
fread(reinterpret_cast<BITMAPINFOHEADER*>(BitmapInfoHeader), sizeof(BITMAPINFOHEADER), 1, filePointer);
if(BitmapInfoHeader->biSize == 40 && BitmapInfoHeader->biCompression == BI_BITFIELDS) {
printf("This types of image uses Extra bit masks\n");
}
// row pading
int RowSize = ((BitmapInfoHeader->biBitCount * BitmapInfoHeader->biWidth + 31) / 32) * 4;
int PixelArraySize = RowSize * BitmapInfoHeader->biHeight;
int height = BitmapInfoHeader->biHeight * 5;
int width = BitmapInfoHeader->biWidth * 5;
printf("RowSize: %d PixelArraySize: %d\n", RowSize, PixelArraySize);
ImageArray = (int**)malloc(sizeof(int*)*height);
// memory allocation
for(int i = 0; i < height; i++)
ImageArray[i] = (int*)malloc(sizeof(int)*width);
data = (char*)malloc(PixelArraySize);
fseek(filePointer, bmp->offset, SEEK_SET);
// set image into array
for(int ii = 0; ii < height; ii+=3) {
fread(data, RowSize, 3, filePointer);
for(int jj = 0; jj < width; jj+=3) {
ImageArray[ii][jj] = grayScale(data[jj+2], data[jj+1], data[jj]);
SetPixel(context, -jj+1000, -ii+500, RGB(data[jj+2], data[jj+1], data[jj]));
}
}
fclose(filePointer);
return 0;
}
这是我提供给它的原始图像
如您所见,在控制台上打印后,图像宽度也会发生变化
// bmp bitmap
#include <stdlib.h>
#include <stdio.h>
#include <windows.h>
using namespace std;
#pragma pack(1)
struct BitmapFileHeader {
unsigned short type;
unsigned int size;
unsigned short reserved1;
unsigned short reserved2;
unsigned int offset;
};
#pragma pack(0)
unsigned char grayScale(unsigned char r, unsigned char g, unsigned char b) {
return ((r + g + b) / 3);
}
int main() {
char *data;
FILE *filePointer;
int **ImageArray;
BitmapFileHeader *bmp = (struct BitmapFileHeader*)malloc(sizeof(struct BitmapFileHeader));
BITMAPINFOHEADER *BitmapInfoHeader = (BITMAPINFOHEADER*)malloc(sizeof(BITMAPINFOHEADER));
HWND console = GetConsoleWindow();
HDC context = ::GetDC(console) ;
filePointer = fopen("tom.bmp", "rb");
if(!filePointer) {
perror("");
}
fread(reinterpret_cast<BitmapFileHeader*>(bmp), sizeof(BitmapFileHeader), 1, filePointer);
fread(reinterpret_cast<BITMAPINFOHEADER*>(BitmapInfoHeader), sizeof(BITMAPINFOHEADER), 1, filePointer);
if(BitmapInfoHeader->biSize == 40 && BitmapInfoHeader->biCompression == BI_BITFIELDS) {
printf("This types of image uses Extra bit masks\n");
}
// row pading
int RowSize = ((BitmapInfoHeader->biBitCount * BitmapInfoHeader->biWidth + 31) / 32) * 4;
int PixelArraySize = RowSize * BitmapInfoHeader->biHeight;
int height = BitmapInfoHeader->biHeight * 5;
int width = BitmapInfoHeader->biWidth * 5;
printf("RowSize: %d PixelArraySize: %d\n", RowSize, PixelArraySize);
ImageArray = (int**)malloc(sizeof(int*)*height);
// memory allocation
for(int i = 0; i < height; i++)
ImageArray[i] = (int*)malloc(sizeof(int)*width);
data = (char*)malloc(PixelArraySize);
fseek(filePointer, bmp->offset, SEEK_SET);
// set image into array
for(int ii = 0; ii < height; ii+=3) {
fread(data, RowSize, 3, filePointer);
for(int jj = 0; jj < width; jj+=3) {
ImageArray[ii][jj] = grayScale(data[jj+2], data[jj+1], data[jj]);
SetPixel(context, -jj+1000, -ii+500, RGB(data[jj+2], data[jj+1], data[jj]));
}
}
fclose(filePointer);
return 0;
}
//bmp位图
#包括
#包括
#包括
使用名称空间std;
#布拉格语包(1)
结构BitmapFileHeader{
无符号短型;
无符号整数大小;
未签字的短期储备1;
未签字的短期储备2;
无符号整数偏移量;
};
#pragma包(0)
无符号字符灰度(无符号字符r、无符号字符g、无符号字符b){
回报率((r+g+b)/3);
}
int main(){
字符*数据;
文件*文件指针;
int**ImageArray;
BitmapFileHeader*bmp=(结构BitmapFileHeader*)malloc(sizeof(结构BitmapFileHeader));
BitMapInfo头*BitMapInfo头=(BitMapInfo头*)malloc(sizeof(BitMapInfo头));
HWND console=GetConsoleWindow();
HDC上下文=::GetDC(控制台);
filePointer=fopen(“tom.bmp”、“rb”);
如果(!filePointer){
佩罗尔(“”);
}
fread(reinterpret_cast(bmp),sizeof(BitmapFileHeader),1,filePointer);
fread(reinterpret_cast(BitMapInfo头),sizeof(BitMapInfo头),1,filePointer);
如果(BitMapInfo头->biSize==40&&BitMapInfo头->双压缩==BI\U位域){
printf(“这种类型的图像使用额外的位掩码\n”);
}
//排垫
int RowSize=((BitMapInfo头->biBitCount*BitMapInfo头->biWidth+31)/32)*4;
int PixelArraySize=行大小*位图信息头->双高度;
int height=BitMapInfo头->biHeight*5;
int-width=BitMapInfo头->biWidth*5;
printf(“行大小:%d像素阵列大小:%d\n”,行大小,像素阵列大小);
ImageArray=(int**)malloc(sizeof(int*)*高度);
//内存分配
对于(int i=0;ioffset,SEEK\u SET);
//将图像设置为数组
对于(int ii=0;ii<高度;ii+=3){
fread(数据,行大小,3,文件指针);
对于(int jj=0;jj
这是我写的代码。一个像素由三个字节描述,每个RGB通道一个字节。这里处理的是两个索引:行数据中像素的索引和像素在宽度方向上的位置。放置像素并访问具有相同索引的行数据 因此:
(这里,单字母表示源值,双字母表示目标值。)感谢您的快速回放,我将增量更改为1,rbg更改为灰色,间隙仍然存在,但已最小化,我将宽度和高度相乘的原因是为了扩大阵列,如果我不将它乘以5,图像将显示为两半。啊,我错过了你必须使用
数据[3*jj+2]
等等。或者,您可以保留增量3,并说SetPixel(context,-jj/3+1000,…)
。我会更新我的答案。哇哦,它成功了,谢谢兄弟,但是-jj/3
是什么意思?先生,更新你的答案,让我接受它作为回答。另外一件事,如果我想把它放大5倍或是一些因素呢?
int scale = 5;
int ww = scale * w;
int hh = scale * h;
// read ImageArray
for (int y = 0; y < h; y++) {
fread(data, RowSize, 3, filePointer);
for (int x = 0; x < w; x++) {
ImageArray[y][x] = ...;
SetPixel(context, -jj+1000, -ii+500, RGB(data[jj+2], data[jj+1], data[jj]));
}
}
for (int yy = 0; yy < hh; yy++) {
fread(data, RowSize, 3, filePointer);
for (int xx = 0; xx < ww; xx++) {
int x = xx / scale;
int y = yy / scale;
SetPixel(context, yy, xx, ImageArray[y][x]);
}
}