范文一:图片旋转任意角度
MFC中BMP图片旋转任意角度、用于绘制模拟时钟表针
filepath为图片路径,angle为旋转角度。旋转以pCenter为中心进行旋转,并且pCenter将位于图片中心
用于绘制模拟时钟表针
void CXXXXX::DrawBmp(CDC *pDC, CString filepath, double angle)
{
double SrcWidth = 0;//图片宽度
double SrcHeight = 0;//图片高度
CFile file; //用于读取BMP文件
BITMAPFILEHEADER bfhHeader;//bmp文件头
BITMAPINFOHEADER bmiHeader; //bmp格式头
LPBITMAPINFO lpBitmapInfo; //bmp格式具体信息
if(!file.Open(filepath,CFile::modeRead)) return; //打开文件 file.Read(&bfhHeader,sizeof(BITMAPFILEHEADER));//读取文件头 if(bfhHeader.bfType!=0x4d42) //判断是否是BM return;
if(bfhHeader.bfSize!=file.GetLength()) return;
if(file.Read((LPSTR)&bmiHeader,sizeof(bmiHeader)) != sizeof(bmiHeader))
return;
SrcHeight = bmiHeader.biHeight; //得到高度和宽度
SrcWidth = bmiHeader.biWidth;
file.SeekToBegin();
file.Read(&bfhHeader,sizeof(BITMAPFILEHEADER)); UINT uBmpInfoLen=(UINT) bfhHeader.bfOffBits-sizeof(BITMAPFILEHEADER);
lpBitmapInfo=(LPBITMAPINFO) new BYTE[uBmpInfoLen]; file.Read((LPVOID) lpBitmapInfo,uBmpInfoLen);
if((* (LPDWORD)(lpBitmapInfo))!=sizeof(BITMAPINFOHEADER)) return;
DWORD dwBitlen=bfhHeader.bfSize - bfhHeader.bfOffBits; LPVOID lpSrcBits=new BYTE[dwBitlen]; //将数据读入lpSrcBits数组
file.Read(lpSrcBits,dwBitlen);
file.Close(); //关闭文件
CDC bmpDC;
bmpDC.CreateCompatibleDC(pDC);
CBitmap bmp;
bmp.CreateCompatibleBitmap(pDC,SrcWidth,SrcHeight); bmpDC.SelectObject(&bmp);
StretchDIBits(bmpDC.m_hDC,0,0,SrcWidth,SrcHeight,0,0,bmiHeader.biWidth,bmiHeader.biHeight,lpSrcBits,lpBitmapInfo,DIB_RGB_COLORS,MERGECOPY); //StretchDIBits不能去掉。将图片贴到bmpDC中
double x1,x2,x3;
double y1,y2,y3;
double maxWidth,maxHeight,minWidth,minHeight; double srcX,srcY;
double sinA,cosA;
double DstWidth;
double DstHeight;
angle=angle/ 180.0 * 3.14159265;
sinA = sin(angle);
cosA = cos(angle);
x1 = SrcWidth * cosA;
y1 = SrcWidth * sinA;
x2 = SrcWidth * cosA - SrcHeight * sinA; y2 = SrcWidth * sinA + SrcHeight * cosA; x3 = -SrcHeight *sinA;
y3 = SrcHeight *cosA;
minWidth = x3> (x1> x2?x2:x1)?(x1> x2?x2:x1):x3; minWidth = minWidth> 0?0:minWidth;
minHeight = y3> (y1> y2?y2:y1)?(y1> y2?y2:y1):y3; minHeight = minHeight> 0?0:minHeight; maxWidth = x3> (x1> x2?x1:x2)?x3:(x1> x2?x1:x2);
maxWidth = maxWidth> 0?maxWidth:0;
maxHeight = y3> (y1> y2?y1:y2)?y3:(y1> y2?y1:y2);
maxHeight = maxHeight> 0?maxHeight:0;
DstWidth = abs(maxWidth - minWidth)+1;
DstHeight =abs(maxHeight - minHeight)+1;
HDC dcDst;//旋转后的内存设备环境
HBITMAP newBitmap;
dcDst = CreateCompatibleDC(pDC->m_hDC);
newBitmap = CreateCompatibleBitmap(pDC->m_hDC,(int)DstWidth,(int)DstHeight);
SelectObject(dcDst,newBitmap);
::FillRect(dcDst,CRect(0,0,DstWidth,DstHeight),CBrush(RGB(255,255,255))); int i = 0;
int j = 0;
for(i = 0; i < dstheight;="" i++)="">
{
for(j = 0; j < dstwidth;="" j++)="">
{
srcX = (j + minWidth) * cosA + (i + minHeight) * sinA; srcY = (i + minHeight) * cosA - (j + minWidth) * sinA; if((srcX >= 0) && (srcX <= srcwidth)="" &&(srcy="">= 0) && (srcY <= srcheight))="">=>
{
BitBlt(dcDst, j, i, 1, 1, bmpDC.m_hDC, (int)srcX, (int)srcY, SRCCOPY);
}
}
}
CRect rtHour;
rtHour.left=pCenter.x-DstWidth/2;
rtHour.right=rtHour.left+DstWidth;
rtHour.top=pCenter.y-DstHeight/2;
rtHour.bottom=rtHour.top+DstHeight;
TransparentBlt(pDC->m_hDC,rtHour.left,rtHour.top,rtHour.Width(),rtHour.Height
(),dcDst,0,0,rtHour.Width(),rtHour.Height(),RGB(255,255,255));
delete[] lpBitmapInfo;
delete[] lpSrcBits;
lpBitmapInfo = NULL;
lpSrcBits = NULL;
::ZeroMemory(&bfhHeader,sizeof(bfhHeader)); ::ZeroMemory(&bmiHeader,sizeof(bmiHeader)); ::ZeroMemory(&lpBitmapInfo,sizeof(lpBitmapInfo));
bmpDC.DeleteDC();
bmp.DeleteObject();
DeleteDC(dcDst);
DeleteObject(newBitmap);
}
范文二:图片任意角度旋转[教材]
/**
*@param imgSource 源图像
*@param cx 旋转点相对于源图像坐上角横坐标
*@param cy 旋转点相对于源图像坐上角纵坐标
*@param theta 图像逆时针旋转的角度
*@return 旋转后的图像
*/
public Image rotate(Image imgSource, int cx, int cy, double theta)
{
if (Math.abs(theta % 360) < 1)="">
return imgSource; //角度很小时直接返回
int w1 = imgSource.getWidth(); //原始图像的高度和宽度
int h1 = imgSource.getHeight();
int[] srcMap = new int[w1 * h1];
imgSource.getRGB(srcMap, 0, w1, 0, 0, w1, h1); //获取原始图像的像素信息
int dx = cx > w1 / 2 ? cx : w1 - cx; //计算旋转半径
int dy = cy > h1 / 2 ? cy : h1 - cy;
double dr = Math.sqrt(dx * dx + dy * dy);
int wh2 = (int) (2 * dr + 1); //旋转后新图像为正方形,其边长+1是为了防止数组越界
int[] destMap = new int[wh2 * wh2]; //存放新图像象素的数组
double destX, destY;
double radian = theta * Math.PI / 180; //计算角度计算对应的弧度值
for (int i = 0; i < w1;="" i++)="" {="">
for (int j = 0; j < h1;="" j++)="" {="">
if (srcMap[j * w1 + i] >> 24 != 0) { //对非透明点才进行处理
// 得到当前点经旋转后相对于新图像左上角的坐标
destX = dr + (i - cx) * Math.cos(radian) + (j - cy) // 这个地方不懂
* Math.sin(radian);
destY = dr + (j - cy) * Math.cos(radian) - (i - cx) //这个地方不懂
* Math.sin(radian);
//从源图像中往新图像中填充像素
destMap[(int) destY * wh2 + (int) destX] = srcMap[j * w1
+ i];// 不懂
}
}
}
return Image.createRGBImage(destMap, wh2, wh2, true); //返回旋转后的图像
}
范文三:c井中图片任意角度旋转
任意角度旋转Bitmap
/// /// 任意角度旋转 ///
/// 原始图Bitmap
/// 旋转角度
///
public static Bitmap BmpRotate(Bitmap bmp, double angle)
{
int w = bmp.Width;
int h = bmp.Height;
int mx = w / 2;
int my = h / 2;
int r = mx < my="" mx="" :="" my;="">
double cos = Math.Cos(angle / 360 * (Math.PI * 2));
double sin = Math.Sin(angle / 360 * (Math.PI * 2));
Bitmap bitmap = new Bitmap(w, h);
for (int x = 0; x < w;="" x="" +="1)">
{
for (int y = 0; y < h;="" y="" +="1)">
{
if ((x - mx) * (x - mx) + (y - my) * (y - my) > r * r)
bitmap.SetPixel(x, y, bmp.GetPixel(x, y));
else
{
double m = (x - mx) * cos + (y - my) * sin;
double n = (y - my) * cos - (x - mx) * sin;
bitmap.SetPixel(x, y, bmp.GetPixel((int)m + mx, (int)n + my));
}
}
}
return bitmap;
}
范文四:WORD图片按90度或任意角度自由旋转
word http://www.doc55.com
Word中的图片如何旋转,
一、按角度旋转:右键点击要旋转的图片,选中“显示图片工具栏”点击,在图片工具栏里有一个按钮,可以按90度大小旋转,直到满意为止或者在“图片工具”功能区的“格式”中,单击“排列”分组中的“旋转”按钮,并在打开的旋转菜单中选中“向右旋转
“向左旋转90°”、“垂直翻转”或“水平翻转”效果如图: 90°”、
二、自由旋转:首先选中图片,右击选择设置图片格式,在“版式”卡中选择环绕方式为“紧密型”或四周型,(默认为嵌入型,这样就无法旋转)回到文档,这时会出现一个绿色的小圆点,把光标放在它上面有一个顺时针的箭头,点住拖拽就可以任意角度旋转了。 Word中图片不能旋转怎么办,
问题描述:
有个报表的图片,长方形的那种,内容较多,正常显示的话,只能显示一小部分,没办法,只好缩小,才能看到全体概况,可是,缩小了,什么都看不清了,我想把图片旋转90度,再放大,这样就可以看到全貌了。但是,在设置图片格式-->大小中,旋转是不可用的,怎么才能让图片旋转呢,
1、跟图片的格式没有关系,网上很多人说必须是截图才可以,没有的事。 2、右击图片,选择“设置图片格式”,发现选项是灰色的,又不想让它只旋转90度,告诉你这么办。
3、选中图片,点击图片上方的旋转控制点。如果没有就在图片上点右键选择"显示图片工具栏".出来后,在上面中间部分有一个按钮是"向左旋转90度"。旋转4次,使之回到之前未旋转的样子。
4、然后你再次右击图片,选择“设置图片格式”-“大小”旋转按钮不再为灰色。问题解决。 问题描述:双击进入在大小里面有个旋转为什么不让设置是灰色的
可以试下:“右键”单击图片,在弹出的下拉列表中选择“设置图片格式”,在弹出的“设置图片格式”的“大小”的“旋转”里面我们可以设置图片旋转的度数,设置完毕后确认即可,这种旋转方式可以达到你想要的效果。
或者点击右键——显示“图片”工具栏——在工具栏就有旋转按钮,你要怎么旋转就怎么旋转
右键单击Word工具栏任意处,在弹出的列表中将“图片”钩上,然后单击“图片”工具栏上的“向左旋转90°”,此时,图片照样可以旋转,只不过是每次转了“90°”而已。
问题描述:插入word里的图片怎么旋转角度?比如旋转90度,仅限于word旋转,把图片放在photoshop里旋转再插入word这个方法我会,我只是想知道word里的图片能不能旋转? 在图片的工具栏上有旋转90度的,在裁剪旁边的那个图标或者是将图片格式改为“浮于文字上方”,就可以在图片格式-大小-尺寸与旋转中设置图片旋转了。
插入图片后,图片的选中框是黑色框八个黑方块,直接点“右键,设置图片格式”,它的旋转选项是灰色的,不能旋转;打开“图片”工具栏(菜单,右键,图片,显示图片工具栏),按里面“向左旋转”图标,然后这个图片的选中框就变成无色框八个小圆圈带上面一个小绿点,这时候拖动绿点,就可以任意旋转了。
word中如何旋转图片~旋转那一项全是灰色的,
由于word2003版本里面的图片默认为嵌入格式的,不能直接旋转。需要通过一个功能才能进行旋转。
简单的:把图复制到ppt(office的幻灯片程序),然后再复制回来,就能转了。 复杂的:
?打开Word菜单栏的“工具”中的“自定义”,在弹出的“自定义”窗口中选择“命令”,然后在“类别”下选择“绘图”,在右边找到“分解图片”,鼠标左键按住“分解图片”将它拖到工具栏上放着;
?在菜单栏依次点击[插入]→[图片]→[来自文件],选中要插入的图片,双击将图片插入到当前Word文档。此时插入的图片在被选中时,它的四周有八个黑色的填充矩形控制句柄。但只能进行水平或垂直方向的翻转或以90°为单位进行旋转。 ?鼠标单击选择图片,然后单击刚才拖出来的“分解图片”按钮,此时,你会发现图片周围会出现一些小圆圈,这就对了;
范文五:MFC中BMP图片旋转任意角度、用于绘制模拟时钟表针
filepath为图片路径,angle为旋转角度。旋转以pCenter为中心进行旋转,并且pCenter将位于图片中心
用于绘制模拟时钟表针
void CXXXXX::DrawBmp(CDC *pDC, CString filepath, double angle)
{
double SrcWidth = 0;//图片宽度
double SrcHeight = 0;//图片高度
CFile ? file; ? ? ? ? ? ? ? ?//用于读取BMP文件
BITMAPFILEHEADER ? bfhHeader;//bmp文件头
BITMAPINFOHEADER ? bmiHeader; ? //bmp格式头
LPBITMAPINFO ? lpBitmapInfo; ? ? ? ? //bmp格式具体信息
if(!file.Open(filepath,CFile::modeRead))
return; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //打开文件
file.Read(&bfhHeader,sizeof(BITMAPFILEHEADER));//读取文件头
if(bfhHeader.bfType!=0x4d42) ? ? ? ? ? ? ? ? ? ? //判断是否是BM
return;
if(bfhHeader.bfSize!=file.GetLength())
return;
if(file.Read((LPSTR)&bmiHeader,sizeof(bmiHeader)) != sizeof(bmiHeader))
return;
SrcHeight ? = ? bmiHeader.biHeight; //得到高度和宽度
SrcWidth ? ?= ? bmiHeader.biWidth;
file.SeekToBegin();
file.Read(&bfhHeader,sizeof(BITMAPFILEHEADER));
UINT ? uBmpInfoLen=(UINT) ? bfhHeader.bfOffBits-sizeof(BITMAPFILEHEADER);
lpBitmapInfo=(LPBITMAPINFO) ? new ? BYTE[uBmpInfoLen];
file.Read((LPVOID) ? lpBitmapInfo,uBmpInfoLen);
if((* ? (LPDWORD)(lpBitmapInfo))!=sizeof(BITMAPINFOHEADER))
return;
DWORD ? dwBitlen=bfhHeader.bfSize ? - ? bfhHeader.bfOffBits;
LPVOID ? lpSrcBits=new ? BYTE[dwBitlen]; //将数据读入lpSrcBits数组
file.Read(lpSrcBits,dwBitlen);
file.Close(); //关闭文件
CDC bmpDC;
bmpDC.CreateCompatibleDC(pDC);
CBitmap bmp;
bmp.CreateCompatibleBitmap(pDC,SrcWidth,SrcHeight);
bmpDC.SelectObject(&bmp);
StretchDIBits(bmpDC.m_hDC,0,0,SrcWidth,SrcHeight,0,0,bmiHeader.biWidth,bmiHeader.biHeight,lpSrcBits,lpBitmapInfo,DIB_RGB_COLORS,MERGECOPY);
//StretchDIBits不能去掉。将图片贴到bmpDC中
double x1,x2,x3;
double y1,y2,y3;
double maxWidth,maxHeight,minWidth,minHeight;
double srcX,srcY;
double sinA,cosA;
double DstWidth;
double DstHeight;
angle=angle/ 180.0 * 3.14159265;
sinA = sin(angle);
cosA = cos(angle);
x1 = SrcWidth * cosA;
y1 = SrcWidth * sinA;
x2 = SrcWidth * cosA - SrcHeight * sinA;
y2 = SrcWidth * sinA + SrcHeight * cosA;
x3 = -SrcHeight *sinA;
y3 = SrcHeight ?*cosA;
minWidth = x3> (x1> x2?x2:x1)?(x1> x2?x2:x1):x3;
minWidth = minWidth> 0?0:minWidth;
minHeight = y3> (y1> y2?y2:y1)?(y1> y2?y2:y1):y3;
minHeight = minHeight> 0?0:minHeight;
maxWidth = x3> (x1> x2?x1:x2)?x3:(x1> x2?x1:x2);
maxWidth = maxWidth> 0?maxWidth:0;
maxHeight = y3> (y1> y2?y1:y2)?y3:(y1> y2?y1:y2);
maxHeight = maxHeight> 0?maxHeight:0;
DstWidth = abs(maxWidth - minWidth)+1;
DstHeight =abs(maxHeight - minHeight)+1;
HDC dcDst;//旋转后的内存设备环境
HBITMAP newBitmap;
dcDst = CreateCompatibleDC(pDC->m_hDC);
newBitmap = CreateCompatibleBitmap(pDC->m_hDC,(int)DstWidth,(int)DstHeight);
SelectObject(dcDst,newBitmap);
::FillRect(dcDst,CRect(0,0,DstWidth,DstHeight),CBrush(RGB(255,255,255)));
int i = 0;
int j = 0;
for(i = 0; i < dstheight;="">
{
for(j = 0; j ?< ?dstwidth;="">
{
srcX = (j + minWidth) * cosA + (i + minHeight) * sinA;
srcY = (i + minHeight) * cosA - (j + minWidth) * sinA;
if((srcX >= 0) && (srcX <= srcwidth)="" &&(srcy="">= ?0) && (srcY <=>=>
{
BitBlt(dcDst, j, i, 1, 1, bmpDC.m_hDC, (int)srcX, (int)srcY, SRCCOPY);
}
}
}
CRect rtHour;
rtHour.left=pCenter.x-DstWidth/2;
rtHour.right=rtHour.left+DstWidth;
rtHour.top=pCenter.y-DstHeight/2;
rtHour.bottom=rtHour.top+DstHeight;
TransparentBlt(pDC->m_hDC,rtHour.left,rtHour.top,rtHour.Width(),rtHour.Height(),dcDst,0,0,rtHour.Width(),rtHour.Height(),RGB(255,255,255));
delete[] lpBitmapInfo;
delete[] lpSrcBits;
lpBitmapInfo = NULL;
lpSrcBits = NULL;
::ZeroMemory(&bfhHeader,sizeof(bfhHeader));
::ZeroMemory(&bmiHeader,sizeof(bmiHeader));
::ZeroMemory(&lpBitmapInfo,sizeof(lpBitmapInfo));
bmpDC.DeleteDC();
bmp.DeleteObject();
DeleteDC(dcDst);
DeleteObject(newBitmap);
}
=>=>