19,468
社区成员
发帖
与我相关
我的任务
分享
//修改点一:看你的程序我理解nSize的值,应该表示目标图像每行像素所占字节数。
nSize = (Dx * P.nBitCount + 31) / 32 * 4; //(int) ((P.nBytesPerLine + P.nHeight * bpd) * alpha);//计算工作单元大小
//
sc = (BYTE*) malloc(nSize);
//修改点二:list应该对应原始图像数据,list[i]应该指向原始图像第i行数据的起始位置。
list = (BYTE**) malloc(P.nHeight * sizeof(BYTE*)); //malloc(Dy * sizeof(BYTE*)); // 申请指针数组
//
//修改点三:如点二说的,list[i]指向图像第i行的起始位置。
for (i = 0; i < P.nHeight; i++)
list[i] = (BYTE*) Imgm->GetPixelAddress(0, i); // ->GetPixelAddress(0, 0) - i * P.nBytesPerLine;//生成二维数组
struct IMAGEPARAMENT P;
RGBQUAD ColorTab[256];
int i, j, nSize;
BYTE **list, *sc;
int Dx, Dy, x1, y1, x2, y2, flag, bpd;
double p, q, a, b, c, d, t1, t2, t3;
if (ImageType(Imgm) == 2) //flag作为标志,当为1时,表示用双线性内插
flag = 1;
else
flag = 0; //为0时,表示用最近邻点法
GetImageParament(Imgm, &P);
Dx = (int) (alpha * P.nWidth);//计算结果位图宽度
Dy = (int) (alpha * P.nHeight);//计算结果位图高度
Imgn -> Destroy();
Imgn ->Create(Dx, Dy, P.nBitCount ); //建立结果位图
bpd = P.nBytesPerPixel;
if (bpd == 1) //256色图像
{
for (i = 0; i < P.nNumColors; i++)
{
GetAllPalette(Imgm, ColorTab);
SetAllPalette(Imgn, ColorTab); //复制调色板
}
}
//修改点一
nSize = (Dx * P.nBitCount + 31) / 32 * 4; //(int) ((P.nBytesPerLine + P.nHeight * bpd) * alpha);//计算工作单元大小
//
sc = (BYTE*) malloc(nSize); //申请像素行工作单元
//修改点二
list = (BYTE**) malloc(P.nHeight * sizeof(BYTE*)); //malloc(Dy * sizeof(BYTE*)); // 申请指针数组
//
//修改点三
for (i = 0; i < P.nHeight; i++)
list[i] = (BYTE*) Imgm->GetPixelAddress(0, i); // ->GetPixelAddress(0, 0) - i * P.nBytesPerLine;//生成二维数组
//
for (j = 0; j < Dy; j++)
{
q = j / alpha;
y1 = (int) q;
y2 = y1 + 1;
q = q - y1;
for (i = 0;i < Dx; i++)
{
p = i / alpha;
x1 = (int) p; //x1,y1为整数部分
x2 = x1 + 1;
p = p - x1; //p,q为小数部分
if ((x2 > P.nWidth)||(y2 > P.nHeight )) // 范围检查
continue;
if (x2 == P.nWidth ) x2--;
if (y2 == P.nHeight ) y2--;
if (flag == 0) //flag等于0,采用最近邻点法
{
if (q > 0.5) y1 = y2;
if (p > 0.5) x1 = x2;
memcpy(&sc[i * bpd], &list[y1][x1 * bpd],bpd); //从源位图复制像素数据
}
else
{ // flag等于1,双线性内插法
a = (double) list[y1][x1]; //从源位图取数据
b = (double) list[y1][x2];
c = (double) list[y2][x1];
d = (double) list[y2][x2];
t1 = (1 - p) * a + p * b; //双线性内插计算
t2 = (1 - p) * c + p * d;
t3 = (1 - q) * t1 + q * t2;
sc[i] = (BYTE) t3;
}
}
SetRectValue(Imgn, 0, j, Dx, 1, sc); //处理结果总结果位图
}
free(sc); //释放工作单元
free(list);