我现在有一张BMP图象,大小是756*288的,我需要将其拉伸成756*576的,请教应该如何实现(系统环境linux)?int w=756;
int h=288;char src[756*288]; //原图象内容
char dst[756*288*2]; //转换后的图象存储空间//src原图象内容
//w原图象宽度
//h原图象高度
//dst转换后的图象存储空间
int bitmap_elongate(char* src, int w, int h, char* dst)
{
}若有描述不清楚的地方,请提出来,我补充,谢谢。
int h=288;char src[756*288]; //原图象内容
char dst[756*288*2]; //转换后的图象存储空间//src原图象内容
//w原图象宽度
//h原图象高度
//dst转换后的图象存储空间
int bitmap_elongate(char* src, int w, int h, char* dst)
{
}若有描述不清楚的地方,请提出来,我补充,谢谢。
http://www.yuanma.org/data/2006/1029/article_1735.htm
*
* 函数名称:
* ZoomDIB()
*
* 参数:
* LPSTR lpDIB - 指向源DIB的指针
* float fXZoomRatio - X轴方向缩放比率
* float fYZoomRatio - Y轴方向缩放比率
*
* 返回值:
* HGLOBAL - 缩放成功返回新DIB句柄,否则返回NULL。
*
* 说明:
* 该函数用来缩放DIB图像,返回新生成DIB的句柄。
*
************************************************************************/HGLOBAL WINAPI ZoomDIB(LPSTR lpDIB, float fXZoomRatio, float fYZoomRatio)
{
// 源图像的宽度和高度
LONG lWidth;
LONG lHeight;
// 缩放后图像的宽度和高度
LONG lNewWidth;
LONG lNewHeight;
// 缩放后图像的宽度(lNewWidth',必须是4的倍数)
LONG lNewLineBytes;
// 指向源图像的指针
LPSTR lpDIBBits;
// 指向源象素的指针
LPSTR lpSrc;
// 缩放后新DIB句柄
HDIB hDIB;
// 指向缩放图像对应象素的指针
LPSTR lpDst;
// 指向缩放图像的指针
LPSTR lpNewDIB;
LPSTR lpNewDIBBits;
// 指向BITMAPINFO结构的指针(Win3.0)
LPBITMAPINFOHEADER lpbmi;
// 指向BITMAPCOREINFO结构的指针
LPBITMAPCOREHEADER lpbmc;
// 循环变量(象素在新DIB中的坐标)
LONG i;
LONG j;
// 象素在源DIB中的坐标
LONG i0;
LONG j0;
// 图像每行的字节数
LONG lLineBytes;
// 找到源DIB图像象素起始位置
lpDIBBits = ::FindDIBBits(lpDIB);
// 获取图像的宽度
lWidth = ::DIBWidth(lpDIB);
// 计算图像每行的字节数
lLineBytes = WIDTHBYTES(lWidth * 8);
// 获取图像的高度
lHeight = ::DIBHeight(lpDIB);
// 计算缩放后的图像实际宽度
// 此处直接加0.5是由于强制类型转换时不四舍五入,而是直接截去小数部分
lNewWidth = (LONG) (::DIBWidth(lpDIB) * fXZoomRatio + 0.5);
// 计算新图像每行的字节数
lNewLineBytes = WIDTHBYTES(lNewWidth * 8);
// 计算缩放后的图像高度
lNewHeight = (LONG) (lHeight * fYZoomRatio + 0.5);
// 分配内存,以保存新DIB
hDIB = (HDIB) ::GlobalAlloc(GHND, lNewLineBytes * lNewHeight + *(LPDWORD)lpDIB + ::PaletteSize(lpDIB));
// 判断是否内存分配失败
if (hDIB == NULL)
{
// 分配内存失败
return NULL;
}
// 锁定内存
lpNewDIB = (char * )::GlobalLock((HGLOBAL) hDIB);
// 复制DIB信息头和调色板
memcpy(lpNewDIB, lpDIB, *(LPDWORD)lpDIB + ::PaletteSize(lpDIB));
// 找到新DIB象素起始位置
lpNewDIBBits = ::FindDIBBits(lpNewDIB);
// 获取指针
lpbmi = (LPBITMAPINFOHEADER)lpNewDIB;
lpbmc = (LPBITMAPCOREHEADER)lpNewDIB;
// 更新DIB中图像的高度和宽度
if (IS_WIN30_DIB(lpNewDIB))
{
// 对于Windows 3.0 DIB
lpbmi->biWidth = lNewWidth;
lpbmi->biHeight = lNewHeight;
}
else
{
// 对于其它格式的DIB
lpbmc->bcWidth = (unsigned short) lNewWidth;
lpbmc->bcHeight = (unsigned short) lNewHeight;
}
// 针对图像每行进行操作
for(i = 0; i < lNewHeight; i++)
{
// 针对图像每列进行操作
for(j = 0; j < lNewWidth; j++)
{
// 指向新DIB第i行,第j个象素的指针
// 注意此处宽度和高度是新DIB的宽度和高度
lpDst = (char *)lpNewDIBBits + lNewLineBytes * (lNewHeight - 1 - i) + j;
// 计算该象素在源DIB中的坐标
i0 = (LONG) (i / fYZoomRatio + 0.5);
j0 = (LONG) (j / fXZoomRatio + 0.5);
// 判断是否在源图范围内
if( (j0 >= 0) && (j0 < lWidth) && (i0 >= 0) && (i0 < lHeight))
{
// 指向源DIB第i0行,第j0个象素的指针
lpSrc = (char *)lpDIBBits + lLineBytes * (lHeight - 1 - i0) + j0;
// 复制象素
*lpDst = *lpSrc;
}
else
{
// 对于源图中没有的象素,直接赋值为255
* ((unsigned char*)lpDst) = 255;
}
}
}
// 返回
return hDIB;
}
我试了那个方法,结果连图象都没有,一片黑的。To tooker :
我用类似你的方法试了一下,也是黑的。给你们看个图象垂直合并的函数,
int bitmap_vcomposite(char *src1, int width1, int height1, char *src2,
int width2, int height2, char *dst, int * width3, int * height3)
{
int64_t i, j; if ((src1 == NULL)||(width1 < 0)||(height1 < 0)||
(width1 != width2)||(src2 == NULL)||(dst == NULL)||
(width3 == NULL) || (height3 == NULL))
{
return -1;
} for(i=0; i<height1; i++)
{
for(j=0; j<width1; j++)
{
dst[3*(i*(width1) + j)] = src1[3*(i*width1 +j)];
dst[3*(i*(width1) + j) +1 ] = src1[3*(i*width1 +j) + 1];
dst[3*(i*(width1) + j) +2 ] = src1[3*(i*width1 +j) + 2];
} } for(i=0; i<height2; i++)
{
for(j=0; j<width2; j++)
{
dst[3*(width1*height1 + i*width2 + j) ] = src2[3*(i*width2 +j)];
dst[3*(width1*height1 + i*width2 + j) + 1 ] = src2[3*(i*width2 +j) + 1];
dst[3*(width1*height1 + i*width2 + j) + 2 ] = src2[3*(i*width2 +j) + 2];
}
} *width3 = width1;
*height3 = height1 + height2;
return 0;
}
//w原图象宽度
//h原图象高度
//垂直放大倍数
int bitmap_velongate(char* src, int w, int h, char* dst, int multiple)
{
int iNewHeight = h * multiple;
for (int i = 0; i < h; ++i)
{
for (int j = 0; j < w; ++j)
{
dst[(3*(i*w+j))*multiple]=src[3*(i*w+j)];
dst[(3*(i*w+j)+1)*multiple]=src[3*(i*w+j)+1];
dst[(3*(i*w+j)+2)*multiple]=src[3*(i*w+j)+2];
}
} //这里应该对新图象dst的空白区域进行填充,但是我不知道应该如何实现。 return 0;
}
就是不知道如何实现啊,
http://cs.nju.edu.cn/gaoy/documents/DIP/Ch06.ppt
for (int i = 0; i < h; ++i)
{
for (int j = 0; j < w; ++j)
{
dst[(3*(i*w+j))*multiple]=src[3*(i*w+j)];
dst[(3*(i*w+j)+1)*multiple]=src[3*(i*w+j)+1];
dst[(3*(i*w+j)+2)*multiple]=src[3*(i*w+j)+2];
}
}
这样如果放大图片,肯定有空缺。
你应该遍历目标图的像素,反推源图中对应的坐标,然后进行像素复制。参考:
http://blog.csdn.net/qiqi5521/archive/2008/03/22/2207562.aspx