CImage图像旋转问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CImage图像旋转问题相关的知识,希望对你有一定的参考价值。

void CMyView::ImageRotation(CImage *Imgn, CImage *Imgm, double alpha)

struct IMAGEPARAMENT P;
RGBQUAD ColorTab[256];
int i, j, ww, Xd, Yd, Dx, Dy,nSize;
double centerx, centery, sintheta, costheta;
double X1, Y1, X2, Y2, theta, xx, yy, rr;
BYTE **list, *sc;
int x1, y1, x2, y2, flag;
double p, q, a, b, c, d, t1, t2, t3;
if (ImageType(Imgm) == 2)

flag = 1; //flag为标志位,当取值为1时,表示双线性内插法

else

flag = 0; //0表示最近邻点法

。。。。。


以上函数中if (ImageType(Imgm) == 2)这句话一直编译不通过
提示 error C2440: “<function-style-cast>”: 无法从“ATL::CImage *”转换为“Gdiplus::ImageType”
本人用 VS2008 SP1 编译的
请各位高手帮帮忙 给个方法解决这个错误 小弟感激不尽

哪有那么复杂,只要用CImage的PlgBlt方法就可以解决90度,180度和反转的问题。
例:

CImage* m_pCurrentFrame;
CPoint m_DisplayPoints[3]; // 放着旋转后的四边形的3个顶点 如果逆时针旋转90度
// m_DisplayPoints[0] 右上角,m_DisplayPoints[1] 左上角
// m_DisplayPoints[3] 右下角

int width,height; // 源图的宽和高

m_pCurrentFrame->PlgBlt(dc,m_DisplayPoints,0,0,width,height); // m_pCurrentFrame 转90度
参考技术A ImageType是自定义函数么,将这个函数的声明和实现贴上来。追问

ImageType是GDI+里的枚举类型

参考技术B 不会啊 参考技术C if(lmgn->GetType()== 2)

这样去判定追问

改用if(lmgn->GetType()== 2)后 还是不通过
提示 error C2039: “GetType”: 不是“ATL::CImage”的成员

追答

哦 你是用的ATl 我用GDIplus 不过你用ImageType显然不行的,因为ImageType是一个枚举。
你goto到CImage的定义里面,去看看用什么函数得到Type的。

参考技术D 不能这样用,你把gdi+和CImage的东西搞混了追问

可是这段代码是从网上找的啊 而且有人用过 是可以用的
这段代码的作用就是实现 CImage 的图像旋转功能 还请高手指点迷津 小弟多谢

追答

这是个自定义函数
int ImageType(CImage *PImgm)
RGBQUAD ColorTab[256];
int k;
if(PImgm->IsNull())
return 0;
switch(PImgm->GetBPP())
case 1: k=0;break;
case 4:k=1;break;
case 8:k=3;break;
default:k=4;break;

if(k==3)
PImgm->GetColorTable(0,256,ColorTab);
k=PaletteType(ColorTab);

return k;

追问

原来是这样 真是多谢大侠指点 如果不麻烦的话 能否将PaletteType函数一并提供呢 小弟感激不尽

追答

没有。。

本回答被提问者采纳

CImage析构函数问题?

我正在使用下面的功能来实时处理图像。使用计时器每10秒调用一次该函数。

问题是我得到断言失败,无法弄清楚确切的问题。我为ImageDC尝试了CImage :: ReleaseDC()和DeleteDC(),但没有运气。

有任何想法吗 ?

LRESULT CAutodetectDialog::AutoscanPatterns(WPARAM, LPARAM)
{
    HWND hwnd = ::FindWindow(NULL, windowTitle);

    if (hwnd != NULL)    
        for (int i=0; i<N_NUMBERS; i++)
        {        
            CImage image;
            image.Create(dbParams.width, dbParams.height, 24);

            CImageDC imageDC(image);
            ::SetWindowOrgEx(imageDC, db.topLeft.x, dbParams.topLeft.y + i * dbParams.height, NULL);
            ::PrintWindow(hwnd, imageDC, PW_CLIENTONLY);

            // Process the image - processing takes < 1 sec
            // and the image parameter is not being changed
            SaveImagePatterns(&image);                
        }            //   <-------------  This line fails , must be the destructor 
                     // of CImage : atlimage.h Line 884,  m_hDC == 0
                     // m_hDC is not NULL in the code

        return 0;
}


// Process the image - processing takes < 1 sec
// and the image parameter is not changed
void CAutodetectDialog::SaveImagePatterns(const CImage* image)
{
.........
}

这是在atlimage.h中失败的代码:

inline HBITMAP CImage::Detach() throw()
{
    HBITMAP hBitmap;

    ATLASSUME( m_hBitmap != NULL );
    ATLASSUME( m_hDC == NULL );             // <------ This guy

    hBitmap = m_hBitmap;
...


...
return( hBitmap );
}

更新:在注释掉函数SaveImagePatterns()之后,断言失败没有发生。因此,问题必须在该函数中,尽管CImage参数作为const传递。

答案

这看起来很可疑:

SaveImagePatterns(&image);

由于image是一个局部变量,取决于SaveImagePatterns对它的作用,这可能会导致问题,因为一旦该块退出,image对象就会被销毁。

另一答案

你在image->GetDC()自己打电话给任何SaveImagePatterns吗?

请注意image->GetDC()需要与image->ReleaseDC()配对。

所以m_hDC将是NULL

以上是关于CImage图像旋转问题的主要内容,如果未能解决你的问题,请参考以下文章

如何旋转图像选定行和取消旋转图像未选定行

快速,旋转图像视图并将旋转的图像视图设置为 uibutton

在 xcode 中旋转图像

jQuery旋转(按度旋转)背景图像

如何确定和自动旋转图像?

旋转和调整图像大小 + iPhone