2

この関数を C で作成して、bmp イメージ内にテキストを配置しました。赤色の最下位ピクセルのみを変更しようとしました。しかし、編集した画像を開くと青が変わっています。データは「stb_image.c」ライブラリから取得されます。

int txt_bmp(char *tekst, int x, int y, unsigned char *data){
    int i, j, k, l = 0;
    unsigned char t,p = 0;
    for (i = 0; i < strlen(tekst); i++){    
        for (j = 0; j < 8; j++){
            t = 0x80;
            k = 1;
            p = tekst[i] & (t/k);
            p >>= (7-j);
            if (p == 0)
               data[l] &= p;
            data[l] |= p;
            k *= 2;
            l += 3;
        }
    }   
    return 0;
}

何が悪いのか分かりますか?

4

2 に答える 2

1

モード (通常の非圧縮 DIB)を使用する場合BI_RGB、24 ビット DIB 内の各トリプレットの順序は次のようになりますblue, green, red(つまり、最下位バイトは青のコンポーネントです)。

BI_BITFIELDSモードを使用し、好みに応じてチャネル マスクを指定することで、コンポーネントを切り替えることができますがBI_BITFIELDS、私の知る限り、このモードは 24 ビット DIB に対して有効ではありません。

したがって、赤のコンポーネントに何かを格納したい場合は、各トリプレットの最上位バイトを使用する必要があります。

于 2013-05-11T11:10:11.117 に答える
0

ここでは、圧縮されていないビットマップを作成します。少し変更して、2kbのRAMを搭載したarduinoで256x256のRGBイメージを作成してSDカードに保存しました。(ピクセルデータだけで192kb)

現在、コードはコメント化されているため、モノクロ イメージ (R チャネルのみ) になります。155 行目から 157 行目を見てください。

// 22nd September 2008
// 10:37pm
// Enhzflep


#include <stdio.h>              // for file I/O
#include <stdlib.h>

#ifndef WORD
 #define WORD unsigned short
#endif

#ifndef DWORD
    #define DWORD unsigned long
#endif

#ifndef BYTE
    #define BYTE unsigned char
#endif

#ifndef LONG
    #define LONG long
#endif

#define BI_RGB 0

#pragma pack(push,2)
typedef struct tagBITMAPFILEHEADER {
    WORD    bfType;
    DWORD   bfSize;
    WORD    bfReserved1;
    WORD    bfReserved2;
    DWORD   bfOffBits;
} BITMAPFILEHEADER,*LPBITMAPFILEHEADER,*PBITMAPFILEHEADER;
#pragma pack(pop)

typedef struct tagBITMAPINFOHEADER{
    DWORD   biSize;
    LONG    biWidth;
    LONG    biHeight;
    WORD    biPlanes;
    WORD    biBitCount;
    DWORD   biCompression;
    DWORD   biSizeImage;
    LONG    biXPelsPerMeter;
    LONG    biYPelsPerMeter;
    DWORD   biClrUsed;
    DWORD   biClrImportant;
} BITMAPINFOHEADER,*LPBITMAPINFOHEADER,*PBITMAPINFOHEADER;
typedef struct tagRGBQUAD {
    BYTE    rgbBlue;
    BYTE    rgbGreen;
    BYTE    rgbRed;
    BYTE    rgbReserved;
} RGBQUAD,*LPRGBQUAD;
typedef struct tagBITMAPINFO {
    BITMAPINFOHEADER bmiHeader;
    RGBQUAD bmiColors[1];
} BITMAPINFO,*LPBITMAPINFO,*PBITMAPINFO;


bool writeBmp24(int width, int height, char *filename, char *data)
{
    BITMAPINFO myBmpInfo;
    unsigned long myInfoSize;
    BITMAPFILEHEADER myBmpFileHeader;
    FILE *outputFile;

    // different bmp file types use different headers
    // this is the one for 24 bit bitmaps
    myInfoSize = sizeof(BITMAPINFOHEADER);

    // magic signature
    myBmpFileHeader.bfType = 0x4D42; // 'BM'

    // reserved data - must be zero
    myBmpFileHeader.bfReserved1 = 0;
    myBmpFileHeader.bfReserved2 = 0;

    // offset into file of the pixel data
    myBmpFileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + myInfoSize;

    // total file size
    myBmpFileHeader.bfSize = sizeof(BITMAPFILEHEADER)
                         + sizeof(BITMAPINFOHEADER)
                         + myInfoSize
                         + width*height*3;

    // size in bytes of this header
    myBmpInfo.bmiHeader.biSize = sizeof(myBmpInfo.bmiHeader);

    // size in bytes of the pixel data
    myBmpInfo.bmiHeader.biSizeImage = width*height*3;

    // image dimensions
    myBmpInfo.bmiHeader.biWidth = width;
    myBmpInfo.bmiHeader.biHeight = height;

    // pixels per meter (used to help select best image for output device)
    myBmpInfo.bmiHeader.biXPelsPerMeter = 2835;
    myBmpInfo.bmiHeader.biYPelsPerMeter = 2835;

    // only 1 pixel plane. Look up X-Mode (early 90s for more info on the concept of planes)
    myBmpInfo.bmiHeader.biPlanes = 1;

    // bits per pixel
    myBmpInfo.bmiHeader.biBitCount = 24;

    // compression type
    myBmpInfo.bmiHeader.biCompression = BI_RGB;

    // only used for images with a pallette
    myBmpInfo.bmiHeader.biClrImportant = 0;
    myBmpInfo.bmiHeader.biClrUsed = 0;


    if (!(outputFile = fopen(filename, "wb")))
        return false;

    if ( fwrite(&myBmpFileHeader, sizeof(BITMAPFILEHEADER), 1, outputFile) != 1)
        goto BmpError;

    if (fwrite(&myBmpInfo, myInfoSize, 1, outputFile) != 1)
        goto BmpError;

    if (fwrite(data, 3, width*height, outputFile) != width*height)
        goto BmpError;

    if (fclose(outputFile))
        return false;

    return true;

BmpError:
           fclose(outputFile);
           return false;
}

int main()
{
    int width = 128;
    int height = 128;

    char *pixelData;//[96*96*3];       //100x100 pixels * 24 bits/pixel
    char *dest;                                  // pointer to data
    int x, y;                                        // cur pixel
    char curVal;

    pixelData = (char*)calloc(3, width * height );
    dest = pixelData;                         // get locatio in mem of raw pixel data
    for (y=0; y<height; y++)           // for all rows of the image
        for (x=0; x<width; x++)       // loop through each pixel
        {
            curVal = x^y;
            dest[0] = 0;//curVal;       // b
            dest[1] = 0;//curVal;       // g
            dest[2] = curVal;           // r
            dest += 3;                            // point to next pixel;
        }

    writeBmp24(width, height, "enhzflep.bmp", pixelData);
    free(pixelData);
}
于 2013-05-11T12:08:52.253 に答える