如何按一定角度显示bmp图片!!!!!!!!!!!!!!!!!!!!!

月光莫利亚 2003-11-25 04:52:34
加精
请问高手在view上显示bmp图片,如何使其旋转一定的角度?
...全文
198 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jasonlu 2003-11-28
  • 打赏
  • 举报
回复

在你视图类里面调用RotateDIB函数

// 更新视图
pDoc->UpdateAllViews(NULL);
另外,注意更新调色板
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;
}

hujun4u 2003-11-27
  • 打赏
  • 举报
回复
用OpenCv
或intelipp库,
简单易用
zjpixyniannian 2003-11-27
  • 打赏
  • 举报
回复
直接对象素进行操作,看看《VC++数字图像处理》
  • 打赏
  • 举报
回复
提醒你:
旋转后的结果 nx,ny 是浮点型的,绘制时要进行反走样
否则会惨不忍睹的。
很艰巨的工作呀,加油呀。
  • 打赏
  • 举报
回复
假使
旋转中心 cx ,cy
角度 a
x,y处的象素旋转后的位置 nx,ny
nx=x+cosa*(x-cx)-sina*(y-cy)
ny=y+sina*(x-cx)+cosa*(y-cy)
我到现在还没得过分 可怜可怜我吧。
月光莫利亚 2003-11-27
  • 打赏
  • 举报
回复
to肖天:可否讲的详细点,不太明白。
meler 2003-11-25
  • 打赏
  • 举报
回复
用GDI+
月光莫利亚 2003-11-25
  • 打赏
  • 举报
回复
谢谢踏雪有痕,不过看起来好像很困难,不知道你的方法能不能实现图片的任意角度旋转?努力研究先。
robothn 2003-11-25
  • 打赏
  • 举报
回复
leadtools作 旋转/放缩 很快,失真也小,不过要花钱
yintongshun 2003-11-25
  • 打赏
  • 举报
回复
http://www.tech521.com/techData/data/1974.asp
yintongshun 2003-11-25
  • 打赏
  • 举报
回复
假如你想拷贝你的destDC的rectDC的内容到新建的设备描述表,设为TRUE。假如
内存设备描述表剪贴回了它的位图,你就不想重绘已有的任何未旋转的位图,这时这
个参数就有用了。请注意CDC::PlgBlt不是一个最快的函数,因此你可以首先创建旋转
的数据,把它们剪贴过去然后创建别的要旋转的内容
假如
--destDC用于打印(我没有一个能够打印旋转后图像的打印机)
--rectDC 与你的destDC的剪贴区域不相交,或者你没有提供rectDC--而你的destDC的
剪贴又是空的
函数就会返回false
bool IsCreated() const;
设备描述表被成功创建,返回true,否则返回false。
const CRect & GetRotRect() const;
operator const CRect & () const { return GetRotRect(); }
  用于获得与目的(“输出”)设备描述表相配合的旋转后的内存设备描述表的
矩形区域假如你指一个图像,对于目的矩形(10,20,250,120),这个函数返回
(-120,10,-20,250) (rotate() 能用于传送别的2维对象)
假如设备描述表没有成功建立,该函数返回(0,0,0,0)
bool Finish();
  通知cdxCRot90DC 你已完成工作--该函数拷贝位图回目的设备描述表,假如
Create()成功返回,该函数由析构器自动调用
你不必调用Invalidate()而且也不用亲自调用Finish() 注意再次调用Finish()
不会再次拷贝位图
void Invalidate();
作废cdxCRot90DC设备描述表--这样Finish()就不会把位图绘制到目的设备描述
表(因此析构器也不会)而且,这个函数会把当前的剪贴区域设为一个空矩形--所
有更多的绘制操作就不会影响内存设备描述表了假如你发现你旋转后的图形是
空的,就可以使用这个函数来避免内存设备描述表把它拷贝回目的设备描述表
(这样做更快速)
CRect rotate(const CRect & r) const;
CPoint rotate(const CPoint & p) const;
CSize rotate(const CSize & s) const;
void rotate(POINT *pPnts, UINT nCnt) const;
转换目的2维对象为旋转后的2维对象. 例如:假如你向Create()传递"r",
GetRotRect()会返回rotate(r).
CRect rotateBack(const CRect & r) const;
CPoint rotateBack(const CPoint & p) const;
CSize rotateBack(const CSize & s) const;
void rotateBack(POINT *pPnts, UINT nCnt) const;
转换旋转后的2维对象为目的2维对象.
CRect operator()(const CRect & r, bool bFwd = true) const;
CPoint operator()(const CPoint & p, bool bFwd = true) const;
CSize operator()(const CSize & sz, bool bFwd = true) const;
void operator()(POINT *pPnts, UINT nCnt, bool bFwd = true) const;
上述函数操作的快捷操作.假如bFwd是true, 使用rotate(),否则使用rotateBack() .
static CRect rotate(const CRect & r, int iAngle);
static CPoint rotate(const CPoint & p, int iAngle);
static CSize rotate(const CSize & s, int iAngle);
static void rotate(POINT *pPnts, UINT nCnt, int iAngle);
  所有从一个目的2维对象到旋转后的2维对象的转化,这种旋转使用"方角"
iAngle你可以使用这些函数来进行计算而不需要创建一个设备描述表
operator cdxCRot90DC * ();
cdxCRot90DC *operator->();
const cdxCRot90DC *operator->() const;
用指针使用类cdxCRot90DC的对象这在使用CDC的要求有一个CDC对象的指针为
参数的函数时有用
一些技巧
  在旋转后的设备描述表中绘制3维文字需要你知道: 在旋转后的设备描述
表中,目的设备描述表的右下角在哪个方向 例如: 假如你想绘制一些变灰的
文字(就如在变灰的CStatic中看到的一样),通常如下使用:
dc.SetBkMode(TRANSPARENT);
dc.SetTextColor(::GetSysColor(COLOR_3DHILIGHT));
dc.TextOut(pnt + CPoint(1,1),strText);
dc.SetTextColor(::GetSysColor(COLOR_3DSHADOW));
dc.TextOut(pnt,strText);
...
  但假如你在旋转后的设备描述表中这样做会怎样呢?以前,你的"阴影"应在
左上角,但假如设备描述表旋转你的输出180°,它就会在右下角--难看!解决方
法是使用rotate()把向量(1,1)转换为旋转后的设备描述表中的相应向量
...
rotDC.SetBkMode(TRANSPARENT);
rotDC.SetTextColor(::GetSysColor(COLOR_3DHILIGHT));
rotDC.TextOut(pnt + rotDC.rotate( CPoint(1,1) ),strText);
rotDC.SetTextColor(::GetSysColor(COLOR_3DSHADOW));
rotDC.TextOut(pnt,strText);
...
...一切都正常了:)
注意成员函数DrawControl() (此处未介绍),它也许会解决你的许多问题
CDC::DrawEdge() 和CDC::Draw3dRect() 也许会有同样的问题!我建议使用如例2
中开头所示的代码,建立需要这些函数的对象(尽管为它们写一个快捷操作会更容
易一些)以支持打印
- cdxCRotButton: A CButton with rotated text & icon. 带有旋转文字和图标的CButton
- cdxCRotStatic: A CStatic with rotated text & icon. 带有旋转文字和图标的CStatic
- cdxCRotBevelLine: A bevelline with rotated text.  带有旋转文字的斜线
这些类已经完成,但我没有时间为codeguru写相应的文章.希望不久就能有时间使cdxCRotDC 能以任何角度旋转.
yintongshun 2003-11-25
  • 打赏
  • 举报
回复
http://www.codeguru.com/bitmap/RotateByShear.shtml
http://www.codeguru.com/bitmap/rotate_bitmap.shtml
http://www.ittide.com/document/article/graphic/12.html
旋转你的图形-高级内存设备描述表
一个内存设备描述表类(CMemDC)
  我最近下载了由Keith Rule发布的CMemDC类(见他在codeguru的文章)它面向
下列问题:假如你在一个设备描述表上执行一个相当大的操作(例如在OnPaint()中)
,你的显示器闪烁相当严重。围绕这个问题,Keith设计了CMemDC,它可以创建一个
兼容的“内存”设备描述表用于画图。在你向这个设备描述表完成绘制后(在内存中),
就可以向可视的原始文本中粘贴了--只有一个blit操作发生。因此输出的闪烁几乎就再
也不会发生了。然而,它的实现假定你总是画整个粘贴区域--甚至在它已经被
WM_ERASEBKGND或某些材料填满的情况下
为什么旋转文本不是很容易
  此外,最近我设计了一个显示旋转文本的按钮。现在,你能创建一个输出旋转文本
的CFont(使用一个LOGFONT并设置lfOrientation和lfEscapement),但它只能在AFAIK的
TrueType类型字体下工作--不能使用MS Sans Serif。至少,假如你设定这个字体,CDC
文本函数看起来会变得混淆不清--会产生“随机”结果....如果不信可以试一试
  因此我看了一下Keith的 CMemDC类和CDC::PlgBlt()函数,决定把CMemDC扩展成一
个“可旋转的” 内存文本,例如:它不仅可以向输出设备描述表剪贴内存位图,如果
你愿意,甚至可以旋转内存位图
cdxCRot90DC--一个可以旋转的内存设备描述表
  cdxCRot90DC 可以解决以下问题。先指定一个“目的设备描述表”(一般是你的输
出设备),它甚至允许你提供当前输出设备描述表之外的一个矩形(而CMemDC总是使用
当前输出设备描述表的剪贴板)以及一个“方角”注意:“方角”是指一个能被90°整
除的角,这就是为什么它叫cdxCRot90DC 而不是cdxCRotDC 。并且注意,我指出的角度x
同样适用于x+n*360 和 x-n*360, n是自然数
一个例子可以说明这个设备描述表做什么(使用一个90°角的cdxCRot90DC )
  你可能认为这种旋转对文本没有限制--你能随心所欲向内存设备描述表绘图,而在
旋转后的结果会放入你的原始设备描述表--很遗憾,你不能使用这样,不能使用你的原
始矩形向cdxCRot90DC绘制--你需要使用自动传送给你的矩形(用GetRotRect()来得到)
假如你选择一个0°的“方角”,cdxCRot90DC 基本上如CMemDC一样具有以下优点:
  你能随意定义想要操作的的目的设备描述表的矩形区域[见constructor/Create()]
  你能最先拷贝前一个设备描述表的内容到你的内存位图(这样可以阻止任何由
WM_ERASEBKGND完成的绘制或由一个自绘控件的DrawItem() 函数完成的绘制)
[见constructor/Create()]
你可以放弃所做出的改变
  CMemDC 总是把它的位图拷贝回你的原始设备描述表--这也许不合适(例如:你发
现一段文本是空的而位图中什么也没有)[function Invalidate()]
对于旋转输出的特性:
透明的角度使用
  你的代码不必为不同的角度而改变(通过使用GetRotRect())。自动克隆原始
设备描述表的字体,背景色,文本模式和文本颜色(而且使用后恢复它们)。对象
能被另一个目的设备描述表矩形重用(没有新的设备描述表对象被创建,旧的位图
只要可能就会被重用)[见Create()]
请注意:
  这个设备描述表不支持打印(与CMemDC相反)。假如谁愿意帮助我实现它,我
会很高兴的。因为我看来没有一个支持旋转输出的打印机:以下是一个简单的例子
OnPaint(), 可以向设备描述表中绘制旋转的文本:[这个例子使用构造器、
GetRotRect(), IsCreated() 和调用Finish()的析构器]
void MyWnd::OnPaint()
  // create "destDC"
  //创建“destDC”
  CPaintDC  destDC(this);
  // get client rect
  //获得客户区矩形
  CRect    rectClient;
  GetClientRect(rectClient);
  {
    cdxCRot90DC rotDC(destDC,rectClient,90 /*90 degress*/ );
    if(!rotDC.IsCreated())
      return;
    // get client rect in rotated coordinates
    //获得在旋转后的坐标系中的客户区矩形
    CRect rectRot = dc.GetRotRect();
    // example: print programmer's most loved text into the
    // the center of the dest DC - rotated and centered
    //例子:打印程序员最爱使用的文本到目的设备描述表的中心--旋转并居中
    CString s = _T("Hello world");
    CSize sz = rotDC.GetTextExtent(s);
    rotDC.TextOut(rectRot.left + (rectRot.Width() - sz.cx) / 2,
      rectRot.top  + (rectRot.Height() - sz.cy) / 2,
      s);
  }
  // destructor of rotDC calls rotDC.Finish()
  //rotDC的析构器调用 rotDC.Finish()
一个OnPaint() 的例子,在你旋转后的内容上画出3维的边界(此处我们直接使用
Finish() )[这个例子使用构造器、GetRotRect(), IsCreated() 和 Finish()]
void MyWnd::OnPaint()
 // create "destDC"
 //创建“destDC”
 CPaintDC  destDC(this);
 // get entire client area
 //得到整个客户区域rectClient
 CRect    rectClient;
 GetClientRect(rectClient);
 // get rectangle you want to draw to except borders
 //得到除了边界外你想要画的矩形rectInner
 CRect rectInner = rectClient;
 rectInner.DeflateRect(::GetSystemMetrics(SM_CXEDGE),::GetSystemMetrics(SM_CYEDGE));
 // constuct rotated device context
 //构造旋转后的设备描述表rotDC
 cdxCRot90DC rotDC(origDC,rectInner,90/*90 degress*/);
 // check whether there is a non-empty visible rectangle
 //检查是否有一个非空的可视矩形
 if(rotDC.IsCreated())
 {
  // get the rectangle rectReal of rotDC that matchs rectRotated in destDC
  //得到rotDC中的用于配合目的设备描述表中旋转后的矩形的矩形rectRotClient
  CRect rectRotClient = rotDC.GetRotRect();
  // draw nice things into my device context using rectRotClient
  //使用rectRotClient向你的设备描述表中绘制
  ...
  rotDC.TextOut(rectRotClient.left,rectRotClient.top,"Left-top text"));
  ...
 }
 // now copy bitmap back to destDC
 //向目的设备描述表中拷贝绘制后的位图
 rotDC.Finish();
 // and draw a border around rectRotated
 //在rectRotated周围画边界
 destDC.DrawEdge(rectClient,EDGE_RAISED,BF_RECT);
函数参考
注意:以下只包括最重要的函数
cdxCRot90DC();
cdxCRot90DC(CDC & destDC, const CRect & rectDC, int iAngle, bool bCopy = false);
cdxCRot90DC(CDC *pdestDC, const CRect & rectDC, int iAngle, bool bCopy = false);
cdxCRot90DC(CDC & destDC, int iAngle, bool bCopy = false);
cdxCRot90DC(CDC *pdestDC, int iAngle, bool bCopy = false);
构造一个新对象
  在下面的四个构造器立即调用Create(),创建一个新的设备描述表假如使用
它们,就应该使用IsCreated()检查是否设备描述表被成功的创建了(否则,假如
Create()失败,cdxCRot90DC::m_hDC (从CDC继承)就不会被成功的建立,运行中
就会有许多ASSERTs...)。更多的信息见Create()
注意:假如设备描述表正确的建立,析构器中会自动调用Finish()
bool Create(CDC & destDC, const CRect & rectDC, int iAngle, bool bCopy = false);
bool Create(CDC * pdestDC, const CRect & rectDC, int iAngle, bool bCopy = false);
bool Create(CDC & destDC, int iAngle, bool bCopy = false);
bool Create(CDC * pdestDC, int iAngle, bool bCopy = false);
创建设备描述表
  假如这个函数成功的返回,你就可以向其中绘制了。调用Finish()把旋转后
的设备描述表中的位图拷贝回你的目的设备描述表(析构器将自动完成这件事)
详细内容见Finish()
注意1:
  因为你的矩形(见下面的参数)可能被转动了,就不能使用rectDC的坐标来绘
制你的数据(它们可能会显示在旋转后的矩形之外)。因此,使用GetRotRect()
来获得配合你的rectDC的设备描述表矩形。
注意2:
  你能调用Create()多次--每次调用都会创建一个“新的”cdxCRot90DC(假如
有了前一个调用,它就不会分配新的位图)然而,假如你想把前一个位图拷贝回它的
目的设备描述表,应该首先调用Finish()
参数:
destDC, pdestDC
“原始”设备描述表;pdestDC不能为NULL。
rectDC
  你想使用内存设备描述表绘制的原始设备描述表中的矩形区域。假如没有提供,
就使用当前设备描述表的整个剪贴区域。注意 在两种情况下,rectDC都会和原始设
备描述表剪贴区域相交,假如不相交,函数会失败。
iAngle
  你的输出的旋转角.例如:假如是“90”,你画一从左向右的的箭头显示出来是
从上倒下的(见示例的图像)假如是“0”,cdxCRot90DC 就和CMemDC 一样(图像没
有旋转)
bCopy
tonybaobao 2003-11-25
  • 打赏
  • 举报
回复
呵呵,可否考虑用photoshop做好效果后,再添加图片?
使用MFC在VS2013编写的数字图象处理软件,能够实现相当强大的功能。 BMP格式读取 保存 DFT FFT 直方图 色调均化 缩放 模糊 锐化 滤镜 形态学处理 曲线 裁剪 灰度图 彩色图 自动阈值 等等...除此之外还有很多其他小功能... 建议使用VS2013打开!!!核心代码在Bmp.cpp中!!! 更新文档: 2014年6月18日更新说明: 这次应该是上交的最后一次作业了,在今日的展示结束之后总体情况还好,但是发现了几个问题。 首先是这个程序是在win8环境下设计的,所以程序的一些大小参数以及按钮图片的位置参数是适合在win8的环境下操作,在设计报告中使用的操作系统也是win8。 而如果将该程序移动至win7系统上操作的话可以在大小与位置上会出现一些偏差,所以推荐将该程序在win8系统下运行,如果没有win8系统但是想重装的话可以找我。 然后本次更新的内容就是对设计报告中的要求的一些补充,比如图片的裁剪功能,还有一些照旧的BUG修复了。 关于这个裁剪功能,在程序中的图像裁剪中有一个说明按钮,在设计报告中有提到怎么使用的,所以在这里就不一一说明了,其实就跟在PS上用裁剪差不多,很容易用的。 关于设计的感想也写在了设计报告上了- -,这里也就不多说了。 好了这个程序算是最终完成了,撒花!师姐辛苦了~!!!!! ================================================================================================================================================================ 2014年5月13日更新说明: 这次的更新比较少,主要就是自动阈值分割图像方面的更新。 实现该操作的函数依然放在Bmp.cpp里面,里面一共使用了三种方式来决定自动阈值。 其中一种是“大津法”,函数是“OtsuThreshold”,该函数最后会返回一个阈值,该阈值就是大津法得出的阈值,具体实现方式可以在cpp文件中查看。 还有一种方法就是“迭代法”,函数是“IterationThreshold”,该函数最后会返回一个阈值,该阈值就是迭代法得出的阈值,具体实现方式可以在cpp文件中查看。 前两种方法的实现方法都如老师在PPT上所说的一样,而且运算起来非常快,基本可以说是瞬时得出。 而第三种方法是我自己写的一个方法,叫做“对半分”法,函数是“HalfCutThreshold”,该函数最后会返回一个阈值,该阈值就是对半分得出的阈值,具体实现方式可以在cpp文件中查看。 其原理就是计算出一个阈值,使到阈值处理后图片的黑色像素与白色像素的数量相等或者最接近,也就是把图片按黑白像素对半分的方法来对图像进行分割。 关于程序的使用方法,可以在鼠标右键菜单中选择“调整”->“阈值”->“高级阈值”来打开高级阈值处理的对话框。 打开对话框后,默认为最直接的自己首选阈值的方法,可以通过鼠标的左键拖动直方图中的绿色竖线来调整需要设定的阈值大小,同时右边会有该图片的预览,可以很方便操作。 如果需要使用自动阈值分割,可以在阈值方式中更改,一旦选择了“直接阈值”以外的阈值方式,程序便会自动用所选择的方法帮你计算出一个阈值,同时在直方图上会显示出该阈值的位置,还有该阈值的大小,同时预览图片也会立即更新。 值得注意的是,当你选择了自动阈值的时候,你不能再通过鼠标左键在直方图上手动调整阈值大小了哦,这个时候你只需要将阈值方式调回“直接阈值”即可重新自己调整! 除了有关作业的更新之外,这次更新还调整了图片备份的内存优化,加上了使用磁盘作为备份的空间,不过这些作为使用者的话是不需要怎么注意的嗯嗯,尽情使用即可! 最后,再次谢谢师姐能够读完这个文档,如果还有什么问题的话就联系我吧,联系方式就在软件中了欢迎点击- -,谢谢! ================================================================================================================================================================ 2014年5月6日更新说明: 这次的主要更新是形态学处理的部分,也就是膨胀、腐蚀、开与闭操作。 实现函数依然是放在Bmp.cpp这个文件里面。名字为Morphology的函数就是该形态学操作的函数。 可以通过在函数中调入不同的参数与设置使到一个函数同时实现膨胀与腐蚀的功能,而开与闭的功能只需要连续调用两次函数,并且参数不同就行了,使用非常简单。 然后就是软件的使用部分,软件的位置依然是放在Release文件夹里面,而形态学处理的按钮在“右键-调整-形态学处理-形态学运算”中,单击后就会出现形态学运算的对话框。 在对话框中会看到一个9*9的结构元素方阵,可以通过使用鼠标左键点击来改变结构元素的形状,双击鼠标为还原结构元素。 设定好结构元素后可以选择操作的四种方式,选择后便会得到处理后的图像了,十分方便。 当然,如果你的图片是彩色的,这个处理也是支持的,因为我的实现函数中把“与”操作改为“取最小值”,“或”操作改为“取最大值”,这个改动在对于二值图像的处理是一样效果的,但是也使到形态学处理适用于彩色图像了。 如果你想把彩色图片或者灰度图片二值化后在进行形态学处理,可以勾选对话框中的“二值化”选项。 值得一提的是,这个二值化是对每一层的颜色单独二值化,如果想要实现阈值效果,可以直接使用阈值功能或者转化为灰度图之后再使用对话框内的二值化,效果是一样的。 除此之外还有一个边缘提取功能,就是形态学处理中的边缘提取,实现方式就是像PPT那样操作了,这里不详细说明了,是个很简单的按钮。 在作业之外的更新有比较多,增加了“马赛克”功能(在“滤镜”中),可以很方便地对整张图片进行打码操作,至于局部打码操作可能会在之后的更新中实现,请耐心等候。 然后还更换了鼠标图案,使大家更容易知道鼠标是否已经处于图片区域中,鼠标图案是片很漂亮的叶子哦(出自KEY的AIR)。 这次更新还增加了瞬时更新鼠标所指像素点的RGB颜色值,横纵坐标,还有当前鼠标所指的颜色的显示。 在之前的版本中,如果想要获得鼠标所指的像素点的像素信息,只能通过鼠标的右键点击,这样有时候会不太方便,而现在的话在主界面就已经可以瞬时看到了,而且清晰明了简单易用。 然后还修复了模糊与中值函数的内存泄漏BUG,相信之后还会有更多的BUG等着来修复- -。 然后本次最大的更新就是!!!本软件支持Jpg格式了!师姐可以试下用这个软件打嘅Jpg格式的图片哦!这个更新简直太人性化了,以后做图像处理终于不用每次都要打开PS把Jpg转换为Bmp再操作了! 最后,再次谢谢师姐能够读完这个文档,如果还有什么问题的话就联系我吧,联系方式就在软件中了欢迎点击- -,谢谢! ================================================================================================================================================================ 2014年4月8日更新说明: 这次更新的是DTF跟FFT这两个功能,DFT的函数在Bmp.cpp的DFT里面,在里面已经加上了注释了。 而FFT在fft12_ifft12.cpp这个文件里面,文件包括了一维FFT和二维FFT的函数,当然IFFT也是存在的。 关于DFT的部分,由于我在DFT的算法里面使用了Complex类与COMPLEX结构体(类包含了运算符的重载与一些常用函数),毕竟C语言并没有专用的复数运算可以调用。 所以在进行DFT运算时会不断调用类的构造函数与析构函数,这导致了进行DFT运算使用的时间比Matlab写出来的要慢很多。 虽然处理起来时间比较长,但是相比FFT的优势是可以对非2的幂数的大小的图片进行傅里叶变换,而非2幂数的FFT的话如果进行补0再运算的话会导致算出的频域是错误的频域(毕竟随意加0会直接影响到这个图片)。 然后为了加快DFT的运算,这里我使用的方法是将复数因子(e的多少次方的那个)分成横向与纵向的乘积,先算出w_h0跟w_w0,之后的其他任何一个因子其实都是他们的幂相乘。 利用这个方法先把因子算好,这样就不用在每一步都计算sin跟cos的值,使到时间变快了很多。 虽然如此,计算一幅256*256的图使用I5CPU都得需要10秒钟,所以这种算法只能将着用,因此我也懒得写IDFT了- -。 所以为了偷懒我的IDFT直接调用了IFFT的函数,也就是说,对于不是2的幂数的图片,你可以进行DFT,但是不能变回来- -。 关于FFT的部分,其速度比Matlab的FFT算法快了不是一般的多,所以在之后的滤波处理中都使用了FFT。 但是FFT的缺点是在进行FFT运算前你必须要把图片大小转成2的幂数(我的软件自带缩放哦~),当然不一定要宽高相等,256*1024也是可以的。 关于这一点我在以后可能会使用因子法来进行FFT而不用现在的radio2法,这样的话可以对非2幂数的图片进行FFT了。 不过由于时间关系,现在的程序依然只能对2的幂数的大小进行FFT,这个非常抱歉。 关于幅值与角度显示,在FFT滤波选项中可以查看到,当然查看角度图片并没有什么意义就是了- -。 然后无论是8位图,24位图还是32位图,DFT跟DDT都完美支持! 然后就是那个FFT滤波的对话框,这里只写出了一个雏形(毕竟这几天清明节没有时间去写,求原谅- -),其实只能看看有什么功能而已,实现的函数其实还没有写的- -。 不过这次的作业并没有要求需要写FFT之后的滤波,所以也不算没有完成作业? 最后,无论是DFT还是FFT全都是自己一个代码一个代码写上去- -,研究傅里叶变换还把信号与系统的书都拿出来了,所以这次的作业真的好辛苦啊! 所以虽然功能尚未完善,但是请体谅!最后,再次谢谢师姐能够读完这个文档,如果还有什么问题的话就联系我吧,谢谢!(为了防止联系不到我,程序里面已经加入了“联系我”按钮了~) ================================================================================================================================================================ 2014年3月31日更新说明: 鉴于上个版本的软件功能还没有完整,而且内存存在泄漏的BUG会导致长时间使用时消耗内存过大。 所以这个版本将完善了很多功能,以及优化了内存问题,基本可以实现长时间使用了嗯嗯~撒花~~~~ 首先,程序的基本操作没有变化,基本都是右键操作,这次增加了重新读取图片功能,可以很方便地对图片进行还原处理。 然后,这次的作业是直方图与滤波器的操作,这些操作可以在直方图的选项与滤波器的选项中选择。 【色调均化】直方图的操作包括色调均化(我用了半天时间终于把PS的色调均化搞懂了,原来PS的色调均化根本不需要转什么色彩空间哦!),色调均化采用的是PS的算法。 【直方图调整】除了色调均化外还有查看直方图功能,该功能可以查看图片各个颜色的直方图以及总颜色(RGB)的直方图,还可以对直方图进行拉伸变换以提高图片的对比度,具体操作只需要用鼠标在直方图上使用左键或右键移动即可。 【曲线】除此之外,还可以对直方图进行函数变化(曲线),我尽量模拟出了PS的曲线效果,但是技术有限- -,这里的曲线只允许一种颜色的函数出现10个折点,合计一共可以出现40个折点,但是基本觉得是够用得了,使用方法依然是很简单,用鼠标点击曲线某一点即可添加或者取消折点。 【平均】这次的作业还有一个就是滤波器的操作,同样在右键菜单中可以选择平均滤波的使用,具体用法很简单,这里就不说明了。 【中值】中值滤波和平均滤波的操作差不多,也不一一说明了。 【锐化】个人觉得除了拉普拉斯的锐化方式之外的锐化都很难看所以就只保留了这两种锐化方式了,将就着用把- -。 【自定义滤波器】为了能够灵活地使用滤波器,一个自定义滤波器的功能还是需要的,具体的功能就跟PS的差不多吧,不过这个功能有个缺点就是当你需要输入负数时,你需要先输入数字再在前面输入负号- -,输入分数时小数点必须快速输入(我设置了一个不太快的刷新- -),虽然现在已经找到解决办法,但是懒得改了就将就着用吧- -。 在实现函数方面,还是在Bmp.cpp与其头文件中,为了让师姐能够容易地找到各个函数的所在,我已经在函数的定义前加上它的中文功能了,相信应该很容易找到。 至于函数过程的注释,由于老师没有要求在作业中需要写出来,同时函数太多也不好写,所以就算了- -,其实算法部分的话要读懂并不那么困难的。 为了方便,我在这里还是把这次作业所需要的函数列出来把(全部函数都在Bmp.cpp中): void Bmp::SmoothAverage(int x,int y)//平均滤波 void Bmp::SmoothMedian(int x,int y)//中值滤波 void Bmp::FilterDefine(double filter[5][5],int divide,int move)//自定义滤波器 void Bmp::CurveFunction(int color,int curve[256])//实现图片的函数变换,就是曲线啦 int** Bmp::GetHistogram()//计算图片的直方图,非归一化直方图 void Bmp::HistogramEqualization()//色调均化,算法采用PS的算法 void Bmp::Histogram(int Color,int Min,int Max)//直方图函数处理,就是直方图拉伸啦 以上就是这次作业的内容啦,为了方便,我还加入了 图像缩放 彩色转灰度 阈值 等功能,基本上这个程序已经越来越完善了,接下来就是慢慢添加功能以及修改细节啦。 最后,再次谢谢师姐能够读完这个文档,如果还有什么问题的话就联系我吧,谢谢! ================================================================================================================================================================ 因为本人的兴趣,我把这次作业做的比较复杂,功能比较多,所以您在找打开保存等函数的时候可能会有点麻烦,所以在这里放一个说明文档。 首先,本程序生成的exe应用程序在Realse目录下,那个有个很漂亮的宝石图标的程序就是了! 打开程序后,您可以使用打开按钮来打开图片,也可以直接把图片用鼠标直接拖入程序中打开(个人推荐第二种,毕竟方便)。 这个程序是支持8位图24位图32位图的哦! 打开后可以使用保存按钮保存图片,使用存为文本来保存为文本文档,我的程序会把图片以颜色层数为依据来保存文本文档。 如果您想使用我加入的其他功能,可以对着图片按右键,在弹出的菜单中选中你想要的功能就是了,但是锐化功能还没写(因为时间不够- -),其他的功能可以将就用下。 如果您想要找到这个程序的cpp文件,他在这个文件夹的同名文件夹下(MFC读取显示与保存BMP图像\MFC读取显示与保存BMP图像\Bmp.cpp(.h))。 因为我把与图像有关的操作封装成一个类(C++的),用以与其他的窗口类分来容易编写。 而与本次作业有关的函数有Open(),Save(),SaveAsTxt(),三个,在Bmp.cpp中都可以找到,并且都已经注释了,您可以去那里查找观看。 当然除了这些之外,我还写了其他一些函数如反色反转滤波器等,但是没有注释(因为太懒),师姐(兄)有兴趣的话也可以去看看,当然也可以直接去程序那里看效果。 最后如果师姐(兄)有什么看不懂或者找不到函数在哪的话可以联系我帮你找(毕竟我也觉得文件写得有点长而且复杂),我的手机号码是15800037916(666542)。 谢谢师姐(兄)看完!
一个小巧而又十分强大的Excel加载项(插件)---OBS.DLL,大小1M左右,却能突破微软的技术壁垒,打破Excel的常规应用模式,开辟了Excel的另类应用空间。加载后新增一个"OBS"工具条,适用于Excel2002及以上版本,推荐在Excel2002/2003中使用。 OBS.DLL的主要功能是制作和编辑OBS文档,一种类似TreeView控件的文档。换句话说,OBS.DLL将Excel表格变成了一个功能强大的超级TreeView控件!普通TreeView控件只能显示一列数据(仅一个字段),而OBS表格却可以显示更多的列(N个字段),而且每个字段都可以汇总(这一点又要比Excel自身的分类汇总更直观、简单),再配合VBA,可以让您轻松驾驭超灵无比的Excel! 当然,OBS.DLL还具备一些很有特色的功能,对Excel的功能来说,应该是一个很好的补充。如: 1、中文简繁互换:在简体中文和繁体中文之间进行转换。 2、进制转换:在二进制、八进制、十进制、十六进制之间相互转换。 3、人民币大小写互换:在Excel中,很多时候需要将小写的金额数字转换成大写,而Excel提供的函数转换出来的格式并不符合中国人的习惯,所以... 4、数字签名:对Excel表格中的内容进行签名保护,主要是防止提供者提供的内容被非法修改。可以用于Excel公文的电子签名,实现真正的无纸办公... 5、保存为图片文件:相当于Excel的照相机功能(有过之而无不及)。可以将Excel中的单元格区域、Shape对象、图片、图表等(甚至是组合形式)以gif、jpg、bmp等各式保存到磁盘中。 6、全功能批注----真正所见即所得的批注编辑器。 7、VB/VBA代码归纳与重写:对VB/VBA代码进行混淆,大大降低代码的可读性,是一种保护VB/VBA代码的很有效的方法。详细的注释说明和一目了然的名称将有助于设计阶段的调试和查错,但是代码一旦发布后,这些优点将会使黑客轻而易举地破解你的成果,呵呵,用这个吧,保证黑客对您的VB/VBA代码一点兴趣和胃口都没有!! 8、解除Excel文档的内部密码。很多时候,我们需要设置Excel表格/工作簿的保护密码,可是随着时间的推移,这些密码很可能遗忘了,怎么办?很着急啊!!!哈哈,用这个保证在2分钟之内解决问题(换个角度:不要再自欺欺人了,Excel的内部密码形同虚设)。 9、信息加密/解密。对Excel文档中的一些敏感信息进行加密处理,即使文档被破解了,里面的信息仍然很安全。可以说这个功能是对Excel安全的一个有力补充。 10、工程代码锁定解锁器。可以撤销Excel的VBA保护密码(对word、Access同样有效) 11、控制和保存功能。这个功能能满足我们不用记一个密码就能非常有效地保护我们的Excel文档,而且可以免除来自微软的威胁。 12、Cookie管理器。在信息时代,没有网络怎么可以?上网时间长了,就会发现在临时文件夹中挤满了cookies,不但占据磁盘空间,而且还可能泄露秘密。用“清理cookie”命令吧,又觉得有些没有必要删,否则下次还得再输一遍;一个一个删吧,东西太多,想都不能想。怎么办??用这个啊!!只要一次性设置要保留的cookie并选中“退出Excel时自动清理”即可。以后只要退出Excel,你的cookies目录中就不会再有其它乱七八糟的cookie了。 13、超级预览。可以根据当前的选择内容自动调整预览对象。如果选中的是单元格区域,就只预览你选中的区域;如果选中的是图表,则仅预览选中的图表;如果只是一个单元格,则自动显示分页符... ... 14、屏幕锁定。当我们需要临时离开电脑而又不想关闭Excel文档时(并不局限于Excel文档,也可以是其它,但前提是要运行Excel),可以启动这个功能,这样其他人就不可能看到您不希望他们看到的东西。 15、尝试打开忘记密码的文件。暴力破解Excel的打开密码,注意:这个仅对拥有密码设计方案的人有效。 16、Excel加载项/宏管理器。对当前Excel环境下的加载宏/加载项/VBA加载项进行列表,并可以查看相关属性、修改运行状态,甚至是一键破解。 17、Excel对象管理器,可以批量转换Excel中的对象(图片、Shape、图表等)到图片文件; 18、在Excel中播放背景音乐、定时执行特定的程序、整点报时,一定很惬意... 19、屏幕录像及捕捉。哦,这个功能很强大啊。可以截取屏幕图像、录制屏幕变化、图片格式转换、批量bmp转成AVI文件、AVI文件转成动画GIF文件、图片标注... ...强大的不行啦,赶快去看看吧。快捷键:Ctrl+Alt+SpaceBar 或者 Ctrl+左WinKey(微软左徽标键) 20、DLL神探,DLL的最大威胁就是注入到系统进程中,让人防不胜防... 21、一键恢复Excel的系统菜单。这个功能... ... 22、Excel版简易游戏。只是几个可以在Excel中玩的游戏... 23、计划横道图(甘特图)。偶觉得还是用Excel来做横道图最方便了... ... 24、偶将呆板的网络调查和网络投票移植到OBS.DLL中了,变被动为主动! ... ... 有兴趣的请访问:http://www.ChinaOBS.com 。本站热诚欢迎您的到来。
一个小巧而又十分强大的Excel加载项(插件)---OBS.DLL,大小1M左右,却能突破微软的技术壁垒,打破Excel的常规应用模式,开辟了Excel的另类应用空间。加载后新增一个"OBS"工具条,适用于Excel2002及以上版本,推荐在Excel2002/2003中使用。 OBS.DLL的主要功能是制作和编辑OBS文档,一种类似TreeView控件的文档。换句话说,OBS.DLL将Excel表格变成了一个功能强大的超级TreeView控件!普通TreeView控件只能显示一列数据(仅一个字段),而OBS表格却可以显示更多的列(N个字段),而且每个字段都可以汇总(这一点又要比Excel自身的分类汇总更直观、简单),再配合VBA,可以让您轻松驾驭超灵无比的Excel! 当然,OBS.DLL还具备一些很有特色的功能,对Excel的功能来说,应该是一个很好的补充。如: 1、中文简繁互换:在简体中文和繁体中文之间进行转换。 2、进制转换:在二进制、八进制、十进制、十六进制之间相互转换。 3、人民币大小写互换:在Excel中,很多时候需要将小写的金额数字转换成大写,而Excel提供的函数转换出来的格式并不符合中国人的习惯,所以... 4、数字签名:对Excel表格中的内容进行签名保护,主要是防止提供者提供的内容被非法修改。可以用于Excel公文的电子签名,实现真正的无纸办公... 5、保存为图片文件:相当于Excel的照相机功能(有过之而无不及)。可以将Excel中的单元格区域、Shape对象、图片、图表等(甚至是组合形式)以gif、jpg、bmp等各式保存到磁盘中。 6、全功能批注----真正所见即所得的批注编辑器。 7、VB/VBA代码归纳与重写:对VB/VBA代码进行混淆,大大降低代码的可读性,是一种保护VB/VBA代码的很有效的方法。详细的注释说明和一目了然的名称将有助于设计阶段的调试和查错,但是代码一旦发布后,这些优点将会使黑客轻而易举地破解你的成果,呵呵,用这个吧,保证黑客对您的VB/VBA代码一点兴趣和胃口都没有!! 8、解除Excel文档的内部密码。很多时候,我们需要设置Excel表格/工作簿的保护密码,可是随着时间的推移,这些密码很可能遗忘了,怎么办?很着急啊!!!哈哈,用这个保证在2分钟之内解决问题(换个角度:不要再自欺欺人了,Excel的内部密码形同虚设)。 9、信息加密/解密。对Excel文档中的一些敏感信息进行加密处理,即使文档被破解了,里面的信息仍然很安全。可以说这个功能是对Excel安全的一个有力补充。 10、工程代码锁定解锁器。可以撤销Excel的VBA保护密码(对word、Access同样有效) 11、控制和保存功能。这个功能能满足我们不用记一个密码就能非常有效地保护我们的Excel文档,而且可以免除来自微软的威胁。 12、Cookie管理器。在信息时代,没有网络怎么可以?上网时间长了,就会发现在临时文件夹中挤满了cookies,不但占据磁盘空间,而且还可能泄露秘密。用“清理cookie”命令吧,又觉得有些没有必要删,否则下次还得再输一遍;一个一个删吧,东西太多,想都不能想。怎么办??用这个啊!!只要一次性设置要保留的cookie并选中“退出Excel时自动清理”即可。以后只要退出Excel,你的cookies目录中就不会再有其它乱七八糟的cookie了。 13、超级预览。可以根据当前的选择内容自动调整预览对象。如果选中的是单元格区域,就只预览你选中的区域;如果选中的是图表,则仅预览选中的图表;如果只是一个单元格,则自动显示分页符... ... 14、屏幕锁定。当我们需要临时离开电脑而又不想关闭Excel文档时(并不局限于Excel文档,也可以是其它,但前提是要运行Excel),可以启动这个功能,这样其他人就不可能看到您不希望他们看到的东西。 15、尝试打开忘记密码的文件。暴力破解Excel的打开密码,注意:这个仅对拥有密码设计方案的人有效。 16、Excel加载项/宏管理器。对当前Excel环境下的加载宏/加载项/VBA加载项进行列表,并可以查看相关属性、修改运行状态,甚至是一键破解。 17、Excel对象管理器,可以批量转换Excel中的对象(图片、Shape、图表等)到图片文件; 18、在Excel中播放背景音乐、定时执行特定的程序、整点报时,一定很惬意... 19、屏幕录像及捕捉。哦,这个功能很强大啊。可以截取屏幕图像、录制屏幕变化、图片格式转换、批量bmp转成AVI文件、AVI文件转成动画GIF文件、图片标注... ...强大的不行啦,赶快去看看吧。快捷键:Ctrl+Alt+SpaceBar 或者 Ctrl+左WinKey(微软左徽标键) 20、DLL神探,DLL的最大威胁就是注入到系统进程中,让人防不胜防... 21、一键恢复Excel的系统菜单。这个功能... ... 22、Excel版简易游戏。只是几个可以在Excel中玩的游戏... 23、计划横道图(甘特图)。偶觉得还是用Excel来做横道图最方便了... ... 24、偶将呆板的网络调查和网络投票移植到OBS.DLL中了,变被动为主动! ... ... 有兴趣的请访问:http://www.ChinaOBS.com 。本站热诚欢迎您的到来。
一个小巧而又十分强大的Excel加载项(插件)---OBS.DLL,大小1M左右,却能突破微软的技术壁垒,打破Excel的常规应用模式,开辟了Excel的另类应用空间。加载后新增一个"OBS"工具条,适用于Excel2002及以上版本,推荐在Excel2002/2003中使用。 OBS.DLL的主要功能是制作和编辑OBS文档,一种类似TreeView控件的文档。换句话说,OBS.DLL将Excel表格变成了一个功能强大的超级TreeView控件!普通TreeView控件只能显示一列数据(仅一个字段),而OBS表格却可以显示更多的列(N个字段),而且每个字段都可以汇总(这一点又要比Excel自身的分类汇总更直观、简单),再配合VBA,可以让您轻松驾驭超灵无比的Excel! 当然,OBS.DLL还具备一些很有特色的功能,对Excel的功能来说,应该是一个很好的补充。如: 1、中文简繁互换:在简体中文和繁体中文之间进行转换。 2、进制转换:在二进制、八进制、十进制、十六进制之间相互转换。 3、人民币大小写互换:在Excel中,很多时候需要将小写的金额数字转换成大写,而Excel提供的函数转换出来的格式并不符合中国人的习惯,所以... 4、数字签名:对Excel表格中的内容进行签名保护,主要是防止提供者提供的内容被非法修改。可以用于Excel公文的电子签名,实现真正的无纸办公... 5、保存为图片文件:相当于Excel的照相机功能(有过之而无不及)。可以将Excel中的单元格区域、Shape对象、图片、图表等(甚至是组合形式)以gif、jpg、bmp等各式保存到磁盘中。 6、全功能批注----真正所见即所得的批注编辑器。 7、VB/VBA代码归纳与重写:对VB/VBA代码进行混淆,大大降低代码的可读性,是一种保护VB/VBA代码的很有效的方法。详细的注释说明和一目了然的名称将有助于设计阶段的调试和查错,但是代码一旦发布后,这些优点将会使黑客轻而易举地破解你的成果,呵呵,用这个吧,保证黑客对您的VB/VBA代码一点兴趣和胃口都没有!! 8、解除Excel文档的内部密码。很多时候,我们需要设置Excel表格/工作簿的保护密码,可是随着时间的推移,这些密码很可能遗忘了,怎么办?很着急啊!!!哈哈,用这个保证在2分钟之内解决问题(换个角度:不要再自欺欺人了,Excel的内部密码形同虚设)。 9、信息加密/解密。对Excel文档中的一些敏感信息进行加密处理,即使文档被破解了,里面的信息仍然很安全。可以说这个功能是对Excel安全的一个有力补充。 10、工程代码锁定解锁器。可以撤销Excel的VBA保护密码(对word、Access同样有效) 11、控制和保存功能。这个功能能满足我们不用记一个密码就能非常有效地保护我们的Excel文档,而且可以免除来自微软的威胁。 12、Cookie管理器。在信息时代,没有网络怎么可以?上网时间长了,就会发现在临时文件夹中挤满了cookies,不但占据磁盘空间,而且还可能泄露秘密。用“清理cookie”命令吧,又觉得有些没有必要删,否则下次还得再输一遍;一个一个删吧,东西太多,想都不能想。怎么办??用这个啊!!只要一次性设置要保留的cookie并选中“退出Excel时自动清理”即可。以后只要退出Excel,你的cookies目录中就不会再有其它乱七八糟的cookie了。 13、超级预览。可以根据当前的选择内容自动调整预览对象。如果选中的是单元格区域,就只预览你选中的区域;如果选中的是图表,则仅预览选中的图表;如果只是一个单元格,则自动显示分页符... ... 14、屏幕锁定。当我们需要临时离开电脑而又不想关闭Excel文档时(并不局限于Excel文档,也可以是其它,但前提是要运行Excel),可以启动这个功能,这样其他人就不可能看到您不希望他们看到的东西。 15、尝试打开忘记密码的文件。暴力破解Excel的打开密码,注意:这个仅对拥有密码设计方案的人有效。 16、Excel加载项/宏管理器。对当前Excel环境下的加载宏/加载项/VBA加载项进行列表,并可以查看相关属性、修改运行状态,甚至是一键破解。 17、Excel对象管理器,可以批量转换Excel中的对象(图片、Shape、图表等)到图片文件; 18、在Excel中播放背景音乐、定时执行特定的程序、整点报时,一定很惬意... 19、屏幕录像及捕捉。哦,这个功能很强大啊。可以截取屏幕图像、录制屏幕变化、图片格式转换、批量bmp转成AVI文件、AVI文件转成动画GIF文件、图片标注... ...强大的不行啦,赶快去看看吧。快捷键:Ctrl+Alt+SpaceBar 或者 Ctrl+左WinKey(微软左徽标键) 20、DLL神探,DLL的最大威胁就是注入到系统进程中,让人防不胜防... 21、一键恢复Excel的系统菜单。这个功能... ... 22、Excel版简易游戏。只是几个可以在Excel中玩的游戏... 23、计划横道图(甘特图)。偶觉得还是用Excel来做横道图最方便了... ... 24、偶将呆板的网络调查和网络投票移植到OBS.DLL中了,变被动为主动! ... ... 有兴趣的请访问:http://www.ChinaOBS.com 。本站热诚欢迎您的到来。
1、中文简繁互换:在简体中文和繁体中文之间进行转换。 2、进制转换:在二进制、八进制、十进制、十六进制之间相互转换。 3、人民币大小写互换:在Excel中,很多时候需要将小写的金额数字转换成大写,而Excel提供的函数转换出来的格式并不符合中国人的习惯,所以... 4、数字签名:对Excel表格中的内容进行签名保护,主要是防止提供者提供的内容被非法修改。可以用于Excel公文的电子签名,实现真正的无纸办公... 5、保存为图片文件:相当于Excel的照相机功能(有过之而无不及)。可以将Excel中的单元格区域、Shape对象、图片、图表等(甚至是组合形式)以gif、jpg、bmp等各式保存到磁盘中。 6、全功能批注----真正所见即所得的批注编辑器。 7、VB/VBA代码归纳与重写:对VB/VBA代码进行混淆,大大降低代码的可读性,是一种保护VB/VBA代码的很有效的方法。详细的注释说明和一目了然的名称将有助于设计阶段的调试和查错,但是代码一旦发布后,这些优点将会使黑客轻而易举地破解你的成果,呵呵,用这个吧,保证黑客对您的VB/VBA代码一点兴趣和胃口都没有!! 8、解除Excel文档的内部密码。很多时候,我们需要设置Excel表格/工作簿的保护密码,可是随着时间的推移,这些密码很可能遗忘了,怎么办?很着急啊!!!哈哈,用这个保证在2分钟之内解决问题(换个角度:不要再自欺欺人了,Excel的内部密码形同虚设)。 9、信息加密/解密。对Excel文档中的一些敏感信息进行加密处理,即使文档被破解了,里面的信息仍然很安全。可以说这个功能是对Excel安全的一个有力补充。 10、工程代码锁定解锁器。可以撤销Excel的VBA保护密码(对word、Access同样有效) 11、控制和保存功能。这个功能能满足我们不用记一个密码就能非常有效地保护我们的Excel文档,而且可以免除来自微软的威胁。 12、Cookie管理器。在信息时代,没有网络怎么可以?上网时间长了,就会发现在临时文件夹中挤满了cookies,不但占据磁盘空间,而且还可能泄露秘密。用“清理cookie”命令吧,又觉得有些没有必要删,否则下次还得再输一遍;一个一个删吧,东西太多,想都不能想。怎么办??用这个啊!!只要一次性设置要保留的cookie并选中“退出Excel时自动清理”即可。以后只要退出Excel,你的cookies目录中就不会再有其它乱七八糟的cookie了。 13、超级预览。可以根据当前的选择内容自动调整预览对象。如果选中的是单元格区域,就只预览你选中的区域;如果选中的是图表,则仅预览选中的图表;如果只是一个单元格,则自动显示分页符... ... 14、屏幕锁定。当我们需要临时离开电脑而又不想关闭Excel文档时(并不局限于Excel文档,也可以是其它,但前提是要运行Excel),可以启动这个功能,这样其他人就不可能看到您不希望他们看到的东西。 15、尝试打开忘记密码的文件。暴力破解Excel的打开密码,注意:这个仅对拥有密码设计方案的人有效。 16、Excel加载项/宏管理器。对当前Excel环境下的加载宏/加载项/VBA加载项进行列表,并可以查看相关属性、修改运行状态,甚至是一键破解。 17、Excel对象管理器,可以批量转换Excel中的对象(图片、Shape、图表等)到图片文件; 18、在Excel中播放背景音乐、定时执行特定的程序、整点报时,一定很惬意... 19、屏幕录像及捕捉。哦,这个功能很强大啊。可以截取屏幕图像、录制屏幕变化、图片格式转换、批量bmp转成AVI文件、AVI文件转成动画GIF文件、图片标注... ...强大的不行啦,赶快去看看吧。快捷键:Ctrl+Alt+SpaceBar 或者 Ctrl+左WinKey(微软左徽标键) 20、DLL神探,DLL的最大威胁就是注入到系统进程中,让人防不胜防... 21、一键恢复Excel的系统菜单。这个功能... ... 22、Excel版简易游戏。只是几个可以在Excel中玩的游戏... 23、计划横道图(甘特图)。偶觉得还是用Excel来做横道图最方便了... ... 24、偶将呆板的网络调查和网络投票移植到OBS.DLL中了,变被动为主动! 。。。。。

19,469

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧