Поворот изображения типа IImage * [Windows Mobile] - PullRequest
2 голосов
/ 17 марта 2012

Есть мысли о том, как я могу выполнить поворот на 90 градусов на этом изображении? Ниже приведен мой фрагмент кода.

 HWND hwnd = GetActiveWindow();
HMODULE hmod = GetModuleHandle(NULL);
HRSRC hResInfo = FindResource(hmod,MAKEINTRESOURCE(IDR_JPEG2),_T("JPEG"));

DWORD imagesize = SizeofResource(hmod,hResInfo);
HGLOBAL hResData = LoadResource(hmod,hResInfo);
if(hResData == NULL)
    return -1;
LPVOID resptr = LockResource(hResData);

IImagingFactory *imgF = NULL;
IImage *iimg = NULL;
HDC hdc = pDC->GetSafeHdc();
int iWidth = GetSystemMetrics(SM_CXSCREEN);
int iHeight =  GetSystemMetrics(SM_CYSCREEN);

::CoInitializeEx(NULL, ::COINIT_MULTITHREADED);//Initializing the COM object. It is required before
if (CoCreateInstance(CLSID_ImagingFactory,NULL,CLSCTX_INPROC_SERVER,IID_IImagingFactory,(void **)&imgF) == S_OK)
{
    HRESULT hresult = imgF->CreateImageFromBuffer(resptr,imagesize,BufferDisposalFlagNone,&iimg);
    RECT rect;
    rect.bottom = iHeight;
    rect.left   = 0;
    rect.right  = iWidth;
    rect.top    = 0;

    if(iWidth > iHeight)    
    {
        //Rotation should take place here
    }
    iimg->Draw(hdc,&rect,NULL);
}

Аргумент этой функции имеет тип CDC* pDC.

Ответы [ 2 ]

6 голосов
/ 18 марта 2012

Это очень легко сделать:

  1. Необходимо вызвать QueryInterface для iimg для IBasicBitmapOps
  2. Учитывая его результат, используйте метод Поворот для достижения вашей цели

Надеюсь, это поможет вам

2 голосов
/ 19 марта 2012

Добавление к ответу @ kids_fox.Это то, что я сделал, чтобы выполнить вращение.Надеюсь, что это поможет любому, кто столкнулся с этой проблемой.Добавьте это к функции в вопросе.

    IImage *pImage = NULL, 
    IBitmapImage *pBitmap = NULL; 
    IBitmapImage    *pBitmapRotated = NULL; //Rotated Bitmap                
    IBasicBitmapOps *pBasicBitmapOps = NULL; //BitmapOps
    HRESULT hr = S_FALSE
    if(pImgFactory->CreateBitmapFromImage(iimg ,0,0,PixelFormatDontCare,InterpolationHintDefault,&pBitmap) == S_OK)   
        {   
            if(pBitmap->QueryInterface( IID_IBasicBitmapOps, (void**)&pBasicBitmapOps ) == S_OK)   
            {   
                if(pBasicBitmapOps->Rotate( rotateDegree, InterpolationHintBilinear, &pBitmapRotated) == S_OK)   
                {   
                    hr = pBitmapRotated->QueryInterface(IID_IImage, ( void**)&pImage);   
                    pBitmapRotated->Release();   
                    pBitmapRotated = NULL;   
                }   
                pBasicBitmapOps->Release();   
                pBasicBitmapOps = NULL;   
            }   
            pBitmap->Release();            
            pBitmap = NULL;   
        } 
//Now Draw the image
pImage->Draw(hdc,&rect,NULL);
...