将图像保存到内存

Posted

技术标签:

【中文标题】将图像保存到内存【英文标题】:Saving Image to Memory 【发布时间】:2013-10-08 12:13:56 【问题描述】:

我有一个 dev-c++ 应用程序,它制作屏幕截图并将其写入文件。现在我想将图像写入变量/流。最初我使用了三个Writefile 函数,它们将标题、信息和hbitmap 写入文件。现在我想将数据不保存到文件中,而是保存到流中,以便我可以将其用于进一步处理。我使用的代码是这样的:

/* <Include> */
#include <windows.h>
#include <iostream>
#include <sstream>
/* </Include> */

/* <Const> */
const char *AppName="Yeah";
using namespace std;
/* </Const> */

/* <Function> */
void SaveScreen(HWND pScreen, stringstream Path)

    int     Width  = GetSystemMetrics(SM_CXSCREEN);//1280;
    int     Height = GetSystemMetrics(SM_CYSCREEN);//1024;

    HDC hdcScreen;
    HBITMAP hbmScreen;


    //---------------Bitmap Informationen
    BITMAPINFO infobmp;
    infobmp.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    infobmp.bmiHeader.biWidth = Width;
    infobmp.bmiHeader.biHeight = Height;
    infobmp.bmiHeader.biPlanes = 1;
    infobmp.bmiHeader.biBitCount = 24;
    infobmp.bmiHeader.biCompression = 0;
    infobmp.bmiHeader.biSizeImage = 0;
    infobmp.bmiHeader.biXPelsPerMeter = 0;
    infobmp.bmiHeader.biYPelsPerMeter = 0;
    infobmp.bmiHeader.biClrUsed = 0;
    infobmp.bmiHeader.biClrImportant = 0;

    int* bitmap = new int[Width*Height*3];

    BITMAPFILEHEADER bfheader;

    bfheader.bfType = 19778;
    bfheader.bfSize = sizeof(BITMAPFILEHEADER) + Width*Height*3 + sizeof(BITMAPINFOHEADER);
    bfheader.bfReserved1 = 0;
    bfheader.bfReserved2 = 0;
    bfheader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
    //Bitmap -----------------------      Informationen


    hdcScreen = GetWindowDC(pScreen);
    hbmScreen = CreateCompatibleBitmap(hdcScreen, Width, Height);

    // tempor?rer DC
    HDC hdcTemp = CreateCompatibleDC(hdcScreen);

    // Bitmap reinselektieren
    HBITMAP hbmOld = (HBITMAP)SelectObject(hdcTemp, hbmScreen);

    // Inhalt von Desktop ?bertragen
    BitBlt(hdcTemp, 0, 0, Width, Height, hdcScreen, 0, 0, SRCCOPY);

    int iResult = GetDIBits(hdcTemp, hbmScreen, 0, Height, bitmap, &infobmp, DIB_RGB_COLORS);

    // aufr?umen
    SelectObject(hdcTemp, hbmOld);
    DeleteObject(hbmScreen);
    DeleteDC(hdcTemp);

   // HANDLE hfile = CreateFile(Path, GENERIC_WRITE, 0, 0, OPEN_ALWAYS, 0, 0);

    //Datei Schreiben
    DWORD word;
    WriteFile(Path, &bfheader, 14, &word, NULL);
    WriteFile(Path, &infobmp, 40,& word, NULL);
    WriteFile(Path, bitmap, Width*Height*3, &word,NULL);
//    Path = &bfheader & &infobmp & bitmap;
    ReleaseDC(pScreen, hdcScreen);
//    CloseHandle(hfile);
    delete[] bitmap;

/* </Function> */

int WINAPI WinMain(      
    HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR lpCmdLine,
    int nCmdShow)
   
    HWND hWnd = FindWindow(NULL, AppName);


    stringstream ms;
    SaveScreen(hWnd, ms);

    return 0;

谁能告诉我我做错了什么?

【问题讨论】:

具体有哪些进一步处理?将这些信息写入普通内存数组可以吗? @AlexFarber 我想在 HTTP 请求中将其用作 Post-Data 到变量?然后,您可以使用包含足够空间的结构来保存该数据。 @Sreekar 如何使用结构?我对 C++ 编程很陌生,因为我是一个 14 岁的小伙子,但我想为我的学校编写一个程序,并且程序快完成了,我只是想念这个功能。你能给我一个工作的例子吗? 【参考方案1】:

您可以创建这样的结构:

struct ScreenShotBuffer

BITMAPFILEHEADER bfheader;
BITMAPINFO infobmp;
int* bitmap;
;

然后使用该结构创建一个全局变量。

struct ScreenShotBuffer myScreenShot;

无论如何,您正在分配“内存”以使用 malloc 保存数据。 所以你可以用这三行代替WriteBuffer()

myScreenShot.bfheader=bfheader;
myScreenShot.infobmp=infobmp;
myScreenShot.bitmap=bitmap;

【讨论】:

以上是关于将图像保存到内存的主要内容,如果未能解决你的问题,请参考以下文章

触发图像点击事件时,如何将图像保存到手机内存(例如 SD 卡或本地硬盘驱动器)?

将更改的图像保存到相机胶卷时因内存问题而终止

将数据库中的所有图像 (BLOB) 保存到文件夹(“内存不足。”)

保存/使用图像而不分配 300mb 内存

内存中的 OpenCV jpeg 格式图像

从共享内存中保存 4 字节 pP 深度图像