前题条件:
1.假设图片是正方形,边长为L
2.假设图片为8bits的单色图过程:
1.求得在纵向直径上每个坐标点上在圆内的部分得InCircleX0[L],InCircleX1[L];
2.对每条在圆内的的线段(InCircleX0[i]---InCircleX1[i])进行缩放,缩放的的比例为L / (InCircleX1[i] - InCircleX0[i]);以下提供简单的实现:BYTE *pSrcPixel;
BYTE *pDstPixel;int InCircleX0[L], InCircleX1[L];for (int i = 0; i < L; i++)
{
    double x;    x = sqrt((L / 2.0)^2 - (L / 2.0 - i)^2);
    InCircleX0[i] =  (int)(L / 2.0 - x); 
    InCircleX1[i] =  (int)(L / 2.0 + x);
}for (i = 0; i < L; i++)
{
    for (int j = 0; j < L; j++)
    {
        int dest;
        dest = i * L + InCircleX0[i] +
               j * (InCircleX1[i] - InCircleX0[i]) / L;
        pDstPixel[i * L + j] = pSrcPixel[dest];
    }
}以上是最直接的算法,你可以做些优化:
1.你可以在求InCircleX0和InCircleX1时用图形学里求圆的方法,这样速度会有很大提高;
2.在进行缩放时,可以用内插的方法,这样缩放出来的图像效果会有所改善

解决方案 »

  1.   

    楼上的opencc() 
    谢了,可是,我的意思象MaiWang那样
    其实是把一个环形,(不是内切圆)展开成一个矩形!!!
    我有一个按环的圆周一个点一个点生成象素生成新图片的方法,可是太慢!
    想要更好的算法!
    有分,可以另加!!
      

  2.   


    BYTE *pSrcPixel;
    BYTE *pDstPixel;
    BYTE *pCircleX;
    BYTE *PCircleY;int r = L / 2;
    int length;for (int i = 0; i < r; i++)
    {
    int count = 0;
    int p = 1 - r;
    int x = 0, y = r; pCircleX[count] = x;
    pCircleY[count] = y;
    count ++;
    /////////////
    while (x < y)
    {
    x ++;
    if (p < 0)
    p += 2 * x + 1;
    else
    {
    y --;
    p += 2 * (x - y) + 1;
    }
    /////////////
    pCircleX[count] = x;
    pCircleY[count] = y;
    count ++;
    }// 以上求出了1/8圆上的点,根据对称性可求得其它7/8的点
    count = 8 * count;//     ...........
    if (i == 0)
    length = count;
    for (int j = 0; j < length; i++)
    {
            int dest;        dest = pCircleY[j * count/ length] * L + pCircleX[j * count/ length];        pDstPixel[i * length + j] = pSrcPixel[dest];
    }
    }
      

  3.   

    zdouble:    不知你有没有关于自适应算法的资料或者能否告诉我几个相关的网站
      

  4.   

    opencc():
       不幸,我也没有这类东西,不过自适应的算法可以看数值分析。magicist(麦子心情) :
       我把我的意思讲清楚,你看看做取舍吧。
       圆环:0<R1<R<R2;R1上的像素个数小于R上的,R上的小于R2上的,设以2×3.14×R作为矩形的边长,那么R1->R需要增加像素,采用线性插值算法,这相当于加了一个高斯低通滤波器,高频成分损失;同样,对R2->R要减少像素,相当于加高通滤波器,低频成分损失。这就是所谓的能量转移。
      

  5.   

    谢谢opencc和zdouble
    等下看看还有没有其他意见再结贴哦!
      

  6.   

    你给的代码我帮你整理了         CVsViewerApp *pApp=(CVsViewerApp *)AfxGetApp();
    COLORREF color;
        CDC *pDC;
        pDC = new CClientDC(g_pView3);
    CDC memDC;
    memDC.CreateCompatibleDC(pDC);
    CBitmap* memBitmap;
    memBitmap=pSrc->GetBitmap();
    memDC.SelectObject(memBitmap); CDC *pDC1;
    if(!pDst->Create(info->DstWidth,info->DstHeigth,24))
    return FALSE;
    pDC1=pDst->BeginPaint(NULL);
    CPoint pt;
    for(UINT j=0;j<info->DstHeigth;j++)
    for(UINT i=0;i<info->DstWidth;i++){
    pt=FindPoint(i,j,info->OuterRadius);
    color=memDC.GetPixel(pt.x,pt.y);
    pDC1->SetPixelV(i,j,color);
    }
    pDst->EndPaint();
      

  7.   

    CPoint FindPoint(UINT i, UINT j,UINT iRadius)
    {
    CPoint pt;
    CVsViewerApp *pApp=(CVsViewerApp *)AfxGetApp();
    int centerx=(int)(g_pView3->m_imgwidth*g_XINIAccess.m_INIParam.opOmni.XCenter);
    int centery=(int)(g_pView3->m_imgheight*g_XINIAccess.m_INIParam.opOmni.YCenter);
    pt.x=(LONG)((iRadius-j)*cos(((3.14/2)/90)*(i*0.353))+centerx);
    pt.y=(LONG)((iRadius-j)*sin(((3.14/2)/90)*(i*0.353))+centery);
    return pt;
    }