Как конвертировать изображение GDI + * в растровое изображение * - PullRequest
4 голосов
/ 22 июля 2009

Я пишу код на c ++, gdi +.

Я использую метод ImageThumbnail () для получения миниатюры. Однако мне нужно конвертировать его в HBITMAP. Я знаю, что следующий код может получить GetHBITMAP:

Bitmap* img;
HBITMAP temp;
Color color;
img->GetHBITMAP(color, &temp); // if img is Bitmap*  this works well。

Но как я могу быстро конвертировать Image * в Bitmap *? Большое спасибо!

На самом деле, теперь я должен использовать следующий метод:

int width = sourceImg->GetWidth(); // sourceImg is Image*
int height = sourceImg->GetHeight();
Bitmap* Result;
result = new Bitmap(width, height,PixelFormat32bppRGB);
Graphics gr(result);
//gr.SetInterpolationMode(InterpolationModeHighQuality);
gr.DrawImage(&sourceImg,0,0,width,height);

Я действительно не знаю, почему они не предоставляют метод Image * -> Bitmap *. но пусть GetThumbnail () API возвращает объект Image ....

Ответы [ 3 ]

3 голосов
/ 22 июля 2009

Сначала вы можете попробовать dynamic_cast, как во многих случаях (если не в большинстве - по крайней мере, в моих случаях использования) Image действительно является Bitmap. Так

Image* img = getThumbnail( /* ... */ );
Bitmap* bitmap = dynamic_cast<Bitmap*>(img);
if(!bitmap)
    // getThumbnail returned an Image which is not a Bitmap. Convert.
else
    // getThumbnail returned a Bitmap so just deal with it.

Однако, если как-то это не так (bitmap будет NULL), то вы можете попробовать более общее решение.

Например, сохраните Image в COM IStream, используя метод Save, а затем используйте Bitmap::FromStream для создания Bitmap из этого потока.

Простой COM IStream может быть создан с использованием функции CreateStreamOnHGlobal WinAPI . Однако это неэффективно, особенно для больших потоков, но для проверки идеи это подойдет.

Существуют также другие подобные решения, которые можно вывести из чтения Image и Bitmap документации.

К сожалению, я не пробовал самостоятельно (с Image, который не является Bitmap), поэтому я не совсем уверен.

3 голосов
/ 22 июля 2009
Image* img = ???;
Bitmap* bitmap = new Bitmap(img);

Edit: Я смотрел на .NET ссылку на GDI +, но вот как .NET реализует этот конструктор.

using (Graphics graphics = null)
{
    graphics = Graphics.FromImage(bitmap);
    graphics.Clear(Color.Transparent);
    graphics.DrawImage(img, 0, 0, width, height);
}

Все эти функции доступны в C ++ версии GDI +

1 голос
/ 21 апреля 2016

Насколько я могу судить, вам нужно просто создать растровое изображение и нарисовать в нем изображение:

Bitmap* GdiplusImageToBitmap(Image* img, Color bkgd = Color::Transparent)
{
    Bitmap* bmp = nullptr;
    try {
        int wd = img->GetWidth();
        int hgt = img->GetHeight();
        auto format = img->GetPixelFormat();
        Bitmap* bmp = new Bitmap(wd, hgt, format);
        auto g = std::unique_ptr<Graphics>(Graphics::FromImage(bmp));
        g->Clear(bkgd);
        g->DrawImage(img, 0, 0, wd, hgt);
    } catch(...) {
        // this might happen if img->GetPixelFormat() is something exotic
        // ... not sure
    }
    return bmp;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...