Save a JPEG from clipboard

Class Image, Bitmap GDI+

GDI+

See version :

Pas de dépendances

Download :

#include <Windows.h>
#include <GdiPlus.h>
#include <stdio.h>
#pragma comment(lib, "gdiplus.lib")

int GetEncoderClsid(const WCHAR* format, CLSID* pClsid)
{
    UINT  num = 0;          // number of image encoders
    UINT  size = 0;         // size of the image encoder array in bytes

    Gdiplus::ImageCodecInfo* pImageCodecInfo = NULL;

    Gdiplus::GetImageEncodersSize(&num, &size);
    if(size == 0)
        return -1;  // Failure

    pImageCodecInfo = (Gdiplus::ImageCodecInfo*)(malloc(size));
    if(pImageCodecInfo == NULL)
        return -1;  // Failure

    Gdiplus::GetImageEncoders(num, size, pImageCodecInfo);

    for(UINT j = 0; j < num; ++j)
    {
        if( wcscmp(pImageCodecInfo[j].MimeType, format) == 0 )
        {
            *pClsid = pImageCodecInfo[j].Clsid;
            free(pImageCodecInfo);
            return j;  // Success
        }    
    }

    free(pImageCodecInfo);
    return -1;  // Failure
}

void SauverJPG(const wchar_t* fic,int width,int height,const char* flux)
{
    Gdiplus::Bitmap B(width,height);
    int i,j,curs;
    HWND Hcon = GetConsoleWindow();
    HDC Hdc = GetDC(Hcon);  
    for(curs=0,j=height-1;j>=0;j--)
    {
        for(i=0;i<width;i++,curs+=4)
        {
            Gdiplus::Color col(flux[curs+2],flux[curs+1],flux[curs]);
            B.SetPixel(i,j,col);
        }
    }
    CLSID jpgClsid;
    GetEncoderClsid(L"image/jpeg", &jpgClsid);
    if (B.Save(fic,&jpgClsid,NULL)==Gdiplus::Ok)
        printf("Sauvegarde ok\n");
    else
        printf("Sauvegarde echoue\n");
    ReleaseDC(Hcon, Hdc);
}

int main(void)
{
    unsigned long m_gdiplusToken;
    Gdiplus::GdiplusStartupInput gdiplusStartupInput;
    Gdiplus::GdiplusStartup(&m_gdiplusToken, &gdiplusStartupInput, NULL);
    if(OpenClipboard(NULL))
    {
        HANDLE h;
        h = GetClipboardData(CF_DIBV5);
        if(h)
        {
            BITMAPV5HEADER head;
            char *brut = (char *)GlobalLock(h);
            head = *((BITMAPV5HEADER*)brut);
            SauverJPG(L"out.jpg",head.bV5Width,head.bV5Height,brut+head.bV5Size);
            GlobalUnlock(h);
            CloseClipboard();
        }
        else
            printf("Pas d'image dans le presse papier\n");
        CloseClipboard();
    }
    Gdiplus::GdiplusShutdown(m_gdiplusToken);
    return 0;
}




Explanations

	No explanations yet.