C Win32: save .bmp image from HBITMAP

前端 未结 4 2117
谎友^
谎友^ 2021-02-20 07:13

I am working with a framegrabber and need to get the images from computer memory and save them on an image file. after trying for couple of days I end up with the following 2 fu

4条回答
  •  逝去的感伤
    2021-02-20 07:47

    FORMAT_INFO sFormat;
    mvfg_getparam( MVFGPAR_DATAFORMAT, &sFormat, giCurrentGrabberID);
    long lFrameSize     = sFormat.lFrameSize;
    
    BYTE *pBitmap = (BYTE*)malloc(FrameSize);
    memcpy( pBitmap, CamGetPicture(), FrameSize );
    writeBitmapToFile(pBitmap, FrameSize, "tmp.bmp");
    
    /*
     * write our raw data into a bitmap file
     * adding the correct header and put it all
     * together in a single file
     */
    int
    writeBitmapToFile(void *data, unsigned long size, const char *filename)
    {
        bmpFileHeader_t header;
        bmpInfoHeader_t info;
        bmpRGBQuad_t rgb = { 0, 0, 0, 0};
        FILE *out;
        size_t len;
        int i;
    
    
        header.type = 0x4d42; // magic sequence 'BM'
        header.size = 0;
        header.res0 = 0;
        header.res1 = 0;
        /* 256 different colors, each is defined by an bmpRBQuad type */
        header.offset = 256 * sizeof(bmpRGBQuad_t) + 
                        sizeof(bmpInfoHeader_t) + sizeof(bmpFileHeader_t);
        info.size = sizeof(bmpInfoHeader_t);
        info.width = WIDTH;
        info.height = HEIGHT;
        info.planes = 1;
        info.cDepth = 8; /* 8 Bit */
        info.compression = 0;
        info.rawSize = size;
        info.hRes = 0;
        info.vRes = 0;
        info.nrColors = 0x100;
        info.impColors = 0;
    
        out = fopen(filename, "wb");
        if (out == NULL) {
            printf("error cannot open %s for writing\n", filename);
            return -1;
        }
        len = fwrite(&header, 1, sizeof(header), out);
        if (len != sizeof(header)) {
            printf("error while writing header\n");
            return -1;
        }
        len = fwrite(&info, 1, sizeof(info), out);
        if (len != sizeof(info)) {
            printf("error while writing info header\n");
            return -1;
        }
        /* stupid try and error programming leads to this */
        for (i = 0; i < 256; i++) {
            rgb.red = i;
            rgb.green = i;
            rgb.blue = i;
            len = fwrite(&rgb, 1, sizeof(rgb), out);
            if (len != sizeof(rgb)) {
                printf("error while writing rgb header\n");
                return -1;
            }
        }
    
        len = fwrite(data, 1, size, out);
        if (len != size ) {
            printf("error while writing bitmap data\n");
            return -1;
        }
        return 0;
    }
    

    Reference - mikrotron

    Reference - write bitmap

提交回复
热议问题