社区
图形处理/算法
帖子详情
图形旋转和艺术字怎么做
wenjiu5
2003-01-14 08:53:35
老板让我做一套图像处理软件,要求有图形旋转和艺术字等功能,我一点头绪都没有
各位说该怎么做?
...全文
822
8
打赏
收藏
图形旋转和艺术字怎么做
老板让我做一套图像处理软件,要求有图形旋转和艺术字等功能,我一点头绪都没有 各位说该怎么做?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
8 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
tonnyue
2003-01-20
打赏
举报
回复
关注
hailong0108
2003-01-16
打赏
举报
回复
艺术字我没有太好的想法。
有个不成形的想法,把各个字的屏幕坐标经过运算重新赋值。使他扭曲和变形;
你试试
hailong0108
2003-01-16
打赏
举报
回复
《VC++数字图象处理》
// geotrans.h
#ifndef _INC_GeoTransAPI
#define _INC_GeoTransAPI
// 常数π
#define PI 3.1415926535
//角度到弧度转化的宏
#define RADIAN(angle) ((angle)*PI/180.0)
// 函数原型
HGLOBAL WINAPI RotateDIB(LPSTR lpbi, int iRotateAngle);
#endif //!_INC_GeoTransAPI
/*************************************************************************
*
* 函数名称:
* RotateDIB()
*
* 参数:
* LPSTR lpDIB - 指向源DIB的指针
* int iRotateAngle - 旋转的角度(0-360度)
*
* 返回值:
* HGLOBAL - 旋转成功返回新DIB句柄,否则返回NULL。
*
* 说明:
* 该函数用来以图像中心为中心旋转DIB图像,返回新生成DIB的句柄。
* 调用该函数会自动扩大图像以显示所有的象素。函数中采用最邻近插
* 值算法进行插值。
*
************************************************************************/
HGLOBAL WINAPI RotateDIB(LPSTR lpDIB, int iRotateAngle)
{
// 源图像的宽度和高度
LONG lWidth;
LONG lHeight;
// 旋转后图像的宽度和高度
LONG lNewWidth;
LONG lNewHeight;
// 图像每行的字节数
LONG lLineBytes;
// 旋转后图像的宽度(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;
// 旋转角度(弧度)
float fRotateAngle;
// 旋转角度的正弦和余弦
float fSina, fCosa;
// 源图四个角的坐标(以图像中心为坐标系原点)
float fSrcX1,fSrcY1,fSrcX2,fSrcY2,fSrcX3,fSrcY3,fSrcX4,fSrcY4;
// 旋转后四个角的坐标(以图像中心为坐标系原点)
float fDstX1,fDstY1,fDstX2,fDstY2,fDstX3,fDstY3,fDstX4,fDstY4;
// 两个中间常量
float f1,f2;
// 找到源DIB图像象素起始位置
lpDIBBits = ::FindDIBBits(lpDIB);
// 获取图像的"宽度"(4的倍数)
lWidth = ::DIBWidth(lpDIB);
// 计算图像每行的字节数
lLineBytes = WIDTHBYTES(lWidth * 8);
// 获取图像的高度
lHeight = ::DIBHeight(lpDIB);
// 将旋转角度从度转换到弧度
fRotateAngle = (float) RADIAN(iRotateAngle);
// 计算旋转角度的正弦
fSina = (float) sin((double)fRotateAngle);
// 计算旋转角度的余弦
fCosa = (float) cos((double)fRotateAngle);
// 计算原图的四个角的坐标(以图像中心为坐标系原点)
fSrcX1 = (float) (- (lWidth - 1) / 2);
fSrcY1 = (float) ( (lHeight - 1) / 2);
fSrcX2 = (float) ( (lWidth - 1) / 2);
fSrcY2 = (float) ( (lHeight - 1) / 2);
fSrcX3 = (float) (- (lWidth - 1) / 2);
fSrcY3 = (float) (- (lHeight - 1) / 2);
fSrcX4 = (float) ( (lWidth - 1) / 2);
fSrcY4 = (float) (- (lHeight - 1) / 2);
// 计算新图四个角的坐标(以图像中心为坐标系原点)
fDstX1 = fCosa * fSrcX1 + fSina * fSrcY1;
fDstY1 = -fSina * fSrcX1 + fCosa * fSrcY1;
fDstX2 = fCosa * fSrcX2 + fSina * fSrcY2;
fDstY2 = -fSina * fSrcX2 + fCosa * fSrcY2;
fDstX3 = fCosa * fSrcX3 + fSina * fSrcY3;
fDstY3 = -fSina * fSrcX3 + fCosa * fSrcY3;
fDstX4 = fCosa * fSrcX4 + fSina * fSrcY4;
fDstY4 = -fSina * fSrcX4 + fCosa * fSrcY4;
// 计算旋转后的图像实际宽度
lNewWidth = (LONG) ( max( fabs(fDstX4 - fDstX1), fabs(fDstX3 - fDstX2) ) + 0.5);
// 计算新图像每行的字节数
lNewLineBytes = WIDTHBYTES(lNewWidth * 8);
// 计算旋转后的图像高度
lNewHeight = (LONG) ( max( fabs(fDstY4 - fDstY1), fabs(fDstY3 - fDstY2) ) + 0.5);
// 两个常数,这样不用以后每次都计算了
f1 = (float) (-0.5 * (lNewWidth - 1) * fCosa - 0.5 * (lNewHeight - 1) * fSina
+ 0.5 * (lWidth - 1));
f2 = (float) ( 0.5 * (lNewWidth - 1) * fSina - 0.5 * (lNewHeight - 1) * fCosa
+ 0.5 * (lHeight - 1));
// 分配内存,以保存新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) (-((float) j) * fSina + ((float) i) * fCosa + f2 + 0.5);
j0 = (LONG) ( ((float) j) * fCosa + ((float) i) * fSina + f1 + 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;
}
kingcom_xu
2003-01-15
打赏
举报
回复
艺术字用路径吧...呵呵
qing_li73
2003-01-15
打赏
举报
回复
refer to : http://www.codeproject.com/bitmap/rotatebyshear.asp
mattus_zhao
2003-01-14
打赏
举报
回复
先看一看《VC++数字图象处理》这本书吧,人民邮电出版社。
xyw2278
2003-01-14
打赏
举报
回复
图形旋转似乎还好办
艺术字就难了
chenybin
2003-01-14
打赏
举报
回复
UP
金印客 2011.920
文
字
处理、图片编辑、图片装饰、图文混排、各种几何
图形
及修饰、
艺术
字
、表格、设置背景(图片、颜色、渐变色)、支持层、网格、 参考线、支持元素复制粘贴、支持排版样式及模板的应用 ◇支持文
字
横排、竖排、...
limn:
图形
化的深奥语言,仅在画布上运行
一种
图形
化的深奥语言,受和启发。 limn背后的想法是创建一种可自我修改的语言,该语言可以使用创建事物所需的相同控件来创建图像和科学
艺术
品。 实现的功能: 代码画布-完整 将
字
符串和数
字
推入堆栈 使用箭头命令...
WPS Office轻松办公(文
字
篇)
本视频教程是指导初学者学习WPS的入门教程,视频中介绍了WPS Office 2019文
字
的...插入
图形
与
艺术
字
,在文档中插入图片,在 文档中插入表格;运用样式编排文档,制作页眉和页脚,制作目录和封面,文档修订与批注等内容
我印123个性相册制作软件 v2.5.8
二、我印123基本功能:图片编辑、图片装饰、图文混排、文
字
处理、各种几何
图形
及修饰、
艺术
字
、表格、设置背景(图片、颜色、渐变色)、支持层、网格、参考线、支持元素复制粘贴、支持排版样式及模板的应用。...
我印123照片书免费制作软件
图片编辑、图片装饰、图文混排、文
字
处理、各种几何
图形
及修饰、
艺术
字
、表格、设置背景(图片、颜色、渐变色)、支持层、网格、参考线、支持元素复制粘贴、支持排版样式及模板的应用 支持图片灰度化、裁切、
旋转
...
图形处理/算法
19,468
社区成员
50,698
社区内容
发帖
与我相关
我的任务
图形处理/算法
VC/MFC 图形处理/算法
复制链接
扫一扫
分享
社区描述
VC/MFC 图形处理/算法
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章