2

JPEG 形式のバイト配列から HBITMAP を作成したいと考えています。

検索しましたが、ビットマップファイルからしか作成できません

HBITMAP hbm = (HBITMAP)LoadImage(NULL,"fileName",IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);

誰かがそれを行う方法を教えてもらえますか?

4

3 に答える 3

4

GDIplus を使用するだけです。JPEGの読み込みをサポートしており、他のいくつかのものはより論理的に感じられます

http://msdn.microsoft.com/en-us/library/ms533830%28v=vs.85%29.aspx

「ビットマップ」クラスを使用します。バッファに jpeg がある場合は、ストリームで読み取る必要があります。

于 2012-05-05T11:35:42.370 に答える
2

MFC は、ビットマップ オブジェクトをラップするCImageクラスを提供します。JPEG、GIF、BMP、PNG などのさまざまな形式で画像を読み込んで保存するための便利なメソッドを提供します。

したがって、ビジネスの最初の順序は、 をCImage表すオブジェクトを取得することHBITMAPです。Attachこれを行うには、メソッドを呼び出してハンドルを渡します。

ただし、この場合、それを完全にスキップして、CImageオブジェクトにファイルから画像を直接ロードさせることができるようです。Loadそのためのメソッドを使用してください。

CImage画像を表すオブジェクトを取得したら、Saveメソッドを呼び出して、目的のファイル名と適切な拡張子を指定するだけです。ドキュメントによると:

パラメータが含まれていない場合guidFileType、ファイル名のファイル拡張子を使用して画像形式が決定されます。拡張子が指定されていない場合、画像は BMP 形式で保存されます。

サンプルコード:

CImage img;
img.Load(TEXT("fileName.bmp"));  // load a bitmap (BMP)
img.Save(TEXT("fileName.jpg"));  // and save as a JPEG (JPG)

LoadJPEG ファイルを読み込むSave方法と BMP ファイルを保存する方法を使用して、このパターンを逆にすることもできます。

于 2012-05-05T11:36:17.843 に答える
1

次のコードを見つけました // http://katahiromz.web.fc2.com/win32/loadjpeg.html

赤と青が入れ替わっていたので、色を修正した修正版です。jpeglib を使用しているため、最初にそれをコンパイルする必要があります。バッファの変換のみが必要な場合は、ファイルをロードする行をスキップできます。変換の詳細は同じである必要があります。

extern "C" {         
#include <jpeglib.h> 
#include <jerror.h>
}
#pragma comment(lib, "jpeg.lib")
HBITMAP LoadJpegAsBitmap(const std::string & filename)
{ 

    struct jpeg_decompress_struct decomp{};
    struct jpeg_error_mgr jerror{};
    BITMAPINFO bi = {};
    LPBYTE lpBuf, pb = NULL;
    HBITMAP hbm{};
    JSAMPARRAY buffer{};
    INT row = 0;

    decomp.err = jpeg_std_error(&jerror);
    jpeg_create_decompress(&decomp);
    FILE* file = fopen(filename.c_str(), "rb");
    if (file == nullptr)
    {   
        return NULL;
    }

    jpeg_stdio_src(&decomp, file);

    jpeg_read_header(&decomp, TRUE); // read jpeg file header
    jpeg_start_decompress(&decomp);  // decompress the file

    row = ((decomp.output_width * 3 + 3) & ~3);
    buffer = (*decomp.mem->alloc_sarray)((j_common_ptr)&decomp, JPOOL_IMAGE,
        row, 1);

    ZeroMemory(&bi.bmiHeader, sizeof(BITMAPINFOHEADER));
    bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    bi.bmiHeader.biWidth = decomp.output_width;
    bi.bmiHeader.biHeight = decomp.output_height;
    bi.bmiHeader.biPlanes = 1;
    bi.bmiHeader.biBitCount = 24;
    bi.bmiHeader.biCompression = BI_RGB;
    bi.bmiHeader.biSizeImage = row * decomp.output_height;

    hbm = CreateDIBSection(NULL, &bi, DIB_RGB_COLORS, (void**)&lpBuf, NULL, 0);
    if (hbm == NULL)
    {
        jpeg_destroy_decompress(&decomp);
        fclose(file);
        return NULL;
    }

    pb = lpBuf + row * decomp.output_height;
    while (decomp.output_scanline < decomp.output_height)
    {
        pb -= row;
        jpeg_read_scanlines(&decomp, buffer, 1);

        if (decomp.out_color_components == 1)
        {
            UINT i;
            LPBYTE p = (LPBYTE)buffer[0];
            for (i = 0; i < decomp.output_width; i++)
            {    
                pb[3 * i + 0] = p[i];
                pb[3 * i + 1] = p[i];
                pb[3 * i + 2] = p[i];  
            }
        }
        else if (decomp.out_color_components == 3)
        {
            // There was talk on Internet about one being RGB and another BGR. 
            // If colors appear swapped, then swap the bytes, and update this comment.
            //CopyMemory(pb, buffer[0], row);

            // Updated color correction
            UINT i;
            LPBYTE p = (LPBYTE)buffer[0];
            for (i = 0; i < row; i += 3)
            {
                pb[i + 0] = p[i + 2]; // Blue   
                pb[i + 1] = p[i + 1]; // Green  
                pb[i +2] = p[i + 0];  // Red    
            }
        }
        else
        {
            jpeg_destroy_decompress(&decomp);
            fclose(file);
            DeleteObject(hbm);
            return NULL;
        }
    }

    SetDIBits(NULL, hbm, 0, decomp.output_height, lpBuf, &bi, DIB_RGB_COLORS);

    jpeg_finish_decompress(&decomp);
    jpeg_destroy_decompress(&decomp);

    fclose(file);

    return hbm;
}
于 2016-09-09T21:34:45.967 に答える