Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在将像素阵列加载到带有填充行的阵列中后,如何填充bmp文件中像素之间的间隙 我用C++编写了一个程序,用SimelVelk Windows函数将BMP图像的像素绘制到控制台,但是在加载像素数组后,图像在像素间打印出了控制台。提前感谢您的帮助_C++_Arrays_C_Bmp - Fatal编程技术网

在将像素阵列加载到带有填充行的阵列中后,如何填充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]);
    }
}