문제

빠르고 쉬운 질문은 다음과 같습니다. C ++의 GDI+를 사용하면 메모리의 픽셀 데이터에서 이미지를 어떻게로드합니까?

도움이 되었습니까?

해결책

아마도 당신이 기대했던 것만 큼 쉽지는 않지만 픽셀 데이터로 BMP 파일을 메모리로 만들 수 있습니다.

필요한 경우 픽셀 데이터를 비트 맵 친화적 형식으로 변환하십시오. 이미 24 비트 RGB 픽셀 데이터를 가지고 있다면 번역이 필요하지 않을 수 있습니다.

비트 맵 파일 헤더 구조를 (메모리로) 생성하고 Bitmapinfo 구조가 이어집니다.

이제 필요한 것들이 있습니다. GDI+가 그것을 이해할 수 있도록 istream에 넣어야합니다. 아마도 가장 쉬운 (가장 성능이없는) 방법은 다음과 같습니다.

  1. BitMapFileHeader의 크기, BitMapInfo 및 Pixel 데이터의 크기로 GlobalAlloc ()을 호출하십시오.
  2. 순서대로 BitMapFileHeader, BitMapInfo 및 Pixel 데이터를 새로운 메모리에 복사하십시오 (새로운 메모리 포인터를 얻으려면 GlobalLock을 호출하십시오).
  3. Memory Inmory BMP에 대한 istream을 얻으려면 CreateStreamonHglobal ()에게 전화하십시오.

이제 gdi+ image :: fromStream () 메소드를 호출하여 이미지를 GDI+에로드하십시오.

행운을 빕니다!

다른 팁

예를 들어 비트 맵 생성기와 픽셀 데이터에 대한 포인터를 직접 사용하는 비트 맵 생성자가 있습니다.

BITMAPINFO bmi;
memset(&bmi, 0, sizeof(bmi));
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biWidth = 32;
bmi.bmiHeader.biHeight = 32;
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biCompression = BI_RGB;
bmi.bmiHeader.biBitCount = 24;
char data[32 * 32 * 3];
// Write pixels to 'data' however you want...
Gdiplus::Bitmap* myImage = new Gdiplus::Bitmap(&bmi, data);

RGB 이미지 인 경우 RGBQuads 등을위한 충분한 공간이있는 비트 맵을 할당 해야하는 팔레트 이미지라면 괜찮습니다.

shcreatememstream을 사용하면 데이터와 데이터 크기에 대한 포인터가 필요합니다.

IStream *pStream = SHCreateMemStream((BYTE *) InputBuffer, Size);
// Do what you want
pStream->Release();

"메모리의 픽셀 데이터"가 특정 이미지 유형, 즉 비트 맵, TIF, PNG 등으로 형식화되어 있습니까? 그렇다면 스트림으로 가져 와서 System.Drawing.Image.FromStream을 사용하십시오.

이 기사 RC (Resource) 파일에서 GDI+ 이미지를로드하는 방법을 설명합니다. 메모리에서 이미지를로드하는 것은 비슷해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top