Estoy escribiendo código en c++, gdi+.

Puedo hacer uso de la Imagen del GetThumbnail() método para obtener imágenes.
Sin embargo, tengo que convertirlo en HBITMAP.
Sé el código siguiente puede obtener GetHBITMAP:

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

Pero ¿cómo puedo convertir de Imagen* en mapa de bits* rápido?
Muchas gracias!

De hecho, ahora tengo que usar el siguiente método:

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);

La verdad, no sé por qué no ofrecer la Imagen* – > mapa de bits* el método. pero vamos a GetThumbnail() de la API de devolver un objeto de la Imagen….

  • La manera de hacerlo está bien. La razón por la que no se puede convertir «rápida» en general es porque Image no es necesariamente un mapa de bits en absoluto – puede ser un vector de la imagen (aunque es el único formato vectorial soy consciente de que es compatible con GDI+ es la WMF/EMF). Me imagino que en este caso, GetThumbnail produciría un vector de la imagen.
InformationsquelleAutor user25749 | 2009-07-22

3 Comentarios

  1. 3
    Image* img = ???;
    Bitmap* bitmap = new Bitmap(img);

    Editar:
    Yo estaba mirando the.NET referencia de GDI+, pero aquí es cómo .NET implementa ese constructor.

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

    Todos aquellos función está disponible en la versión de C++ de GDI+

    • Yo no veo ninguna constructores para Bitmap que aceptar una Image*.
    • a mí también~~ , tal vez en .La RED funciona, pero en c++ no proporcionan este constructor
  2. 3

    Primero puede intentar dynamic_cast como en muchos de los casos (si no la mayoría – al menos en mis casos de uso) Image de hecho es un Bitmap. Así

    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.

    Sin embargo, si de alguna manera no es (bitmap será NULL), entonces usted podría intentar una solución más general.

    Por ejemplo guardar el Image a un COM IStream utilizando Save método y, a continuación, utilizar Bitmap::FromStream para crear Bitmap de ese flujo.

    Un simple COM IStream podría ser creado con el CreateStreamOnHGlobal WinAPI función. Sin embargo, esto no es eficiente, especialmente para las grandes corrientes, sino para poner a prueba la idea de que va a hacer.

    También hay otras soluciones similares que puede ser deducido de la lectura de Imagen y mapa de bits documentación.

    Lamentablemente yo no lo he probado por mi cuenta (con Image que no es un Bitmap), así que no estoy del todo seguro.

    • Parece getThumbnail Método devuelve una Imagen* Objetos…
    • En realidad, el código de la pregunta es una perfectamente buena manera de conseguir un mapa de bits de una Imagen genérica.
    • Mi respuesta da potencialmente solución óptima dado que el coste de dynamic_cast es pequeño (en comparación con el dibujo/la copia de la imagen) y en la mayoría de los casos creo que va a tener éxito. Si no, entonces mi versión o el código en cuestión (añadido después de mi respuesta) es una forma de hacerlo. El código de la pregunta parece más simple y más seguro tú. Sin embargo no estoy seguro de cómo la transparencia va a ser manejado por él. Si es posible, podría ser útil para refactorizar getThumbnail para volver de mapa de bits* como no parece probable que se produce por ejemplo un gráfico vectorial.
    • Estoy de acuerdo en que para una imagen de mapa de bits, GetThumbnail() Método debe devolver una Imagen* que apunta a objeto de mapa de bits en el hecho. Pero Después de tring , la encontré puntos a la Imagen de objeto…
  3. 1

    Tan lejos como puedo decirle a usted para crear un mapa de bits y la pintura de la imagen en él:

    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;
    }

Dejar respuesta

Please enter your comment!
Please enter your name here