前题条件:
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.假设图片是正方形,边长为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.在进行缩放时,可以用内插的方法,这样缩放出来的图像效果会有所改善
谢了,可是,我的意思象MaiWang那样
其实是把一个环形,(不是内切圆)展开成一个矩形!!!
我有一个按环的圆周一个点一个点生成象素生成新图片的方法,可是太慢!
想要更好的算法!
有分,可以另加!!
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];
}
}
不幸,我也没有这类东西,不过自适应的算法可以看数值分析。magicist(麦子心情) :
我把我的意思讲清楚,你看看做取舍吧。
圆环:0<R1<R<R2;R1上的像素个数小于R上的,R上的小于R2上的,设以2×3.14×R作为矩形的边长,那么R1->R需要增加像素,采用线性插值算法,这相当于加了一个高斯低通滤波器,高频成分损失;同样,对R2->R要减少像素,相当于加高通滤波器,低频成分损失。这就是所谓的能量转移。
等下看看还有没有其他意见再结贴哦!
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();
{
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;
}