سؤال

في واحد من أسئلتي السابقة سألت كيف أن تأخذ لقطة وحفظه ك JPEG دون استخدام GDI + بسبب القيود من الحاجة إلى استخدام C. فقط في النهاية أنا أجبت على السؤال نفسي بمساعدة من بعض التعليقات هناك. تستخدم إصدار مقتضب جدا C من GDI + (تحميل في وقت التشغيل) أستطيع أن تأخذ لقطة وحفظه كملف JPEG إلى ملف. الآن، كيف يمكنني حفظ هذا نفس قطة شاشة لا إلى ملف ولكن لمنطقة عازلة؟ وشار * عازلة غير موقعة؟ وهنا رمز التي تحتاج إلى تحويلها.

int SaveJpeg(HBITMAP hBmp, LPCWSTR lpszFilename, ULONG uQuality)
{
    ULONG *pBitmap = NULL;
    CLSID imageCLSID;
    EncoderParameters encoderParams;
    int iRes = 0;

    typedef Status (WINAPI *pGdipCreateBitmapFromHBITMAP)(HBITMAP, HPALETTE, ULONG**);
    pGdipCreateBitmapFromHBITMAP lGdipCreateBitmapFromHBITMAP;

    typedef Status (WINAPI *pGdipSaveImageToFile)(ULONG *, const WCHAR*, const CLSID*, const EncoderParameters*);
    pGdipSaveImageToFile lGdipSaveImageToFile;

    // load GdipCreateBitmapFromHBITMAP
    lGdipCreateBitmapFromHBITMAP = (pGdipCreateBitmapFromHBITMAP)GetProcAddress(hModuleThread, "GdipCreateBitmapFromHBITMAP");
    if(lGdipCreateBitmapFromHBITMAP == NULL)
    {
        // error
        return 0;
    }

    // load GdipSaveImageToFile
    lGdipSaveImageToFile = (pGdipSaveImageToFile)GetProcAddress(hModuleThread, "GdipSaveImageToFile");
    if(lGdipSaveImageToFile == NULL)
    {
        // error
        return 0;
    }

        lGdipCreateBitmapFromHBITMAP(hBmp, NULL, &pBitmap);

       iRes = GetEncoderClsid(L"image/jpeg", &imageCLSID);
       if(iRes == -1)
    {
        // error
        return 0;
    }
    encoderParams.Count = 1;
    encoderParams.Parameter[0].NumberOfValues = 1;
    encoderParams.Parameter[0].Guid  = EncoderQuality;
    encoderParams.Parameter[0].Type  = EncoderParameterValueTypeLong;
    encoderParams.Parameter[0].Value = &uQuality;

    lGdipSaveImageToFile(pBitmap, lpszFilename, &imageCLSID, &encoderParams);


    return 1;
}

وشكرا للمساعدة.

هل كانت مفيدة؟

المحلول

وبدلا من استدعاء GdipSaveImageToFile، يجب عليك استخدام GdipSaveImageToStream. هذا وسوف تمكنك من حفظ الصورة في تيار مباشرة، بدلا من الكتابة إلى ملف.

GDI وظائف صورة للحصول على مزيد من التفاصيل.

في أجل خلق IStream في الذاكرة، يمكنك استخدام <لأ href = "http://msdn.microsoft.com/en-us/library/aa378980(VS.85).aspx" يختلط = "نوفولو noreferrer "> CreateStreamOnHGlobal . هذا لديه خيار السماح للIStream تخصيص الذاكرة الخاصة به، أو لاستخدام منطقة عازلة قبل المخصصة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top