‘壹’ CMap如何使用用法举例
之前,我们已经依次学完了CArray,CList,并且也对它们进行了初步的剖析。 其实,我一直认为CMap是最简单的一个数据类型,如果说,大家对这个数据类型产生不良感觉的话,大多是因为对Hash表的陌生。 Hash表可以认为是数组的一种优化,或者说是对数组缺陷的一种弥补,因为我们知道,数组在具备了高效存取性能的同时,无法动态的调整自身的大小,又严重的影响了它的使用效果。这给了Hash表可乘之机,Hash表总是使用了某种算法尽可能的来达到将成对的元素存储到一个额定的离散的内存空间,它既继承了链表对自身的动态调整,又尽可能的使读写维持在高速的水平,当然无论如何还是要比数组慢的多。 如果你非要让我告诉你,Hash表是什么样的一个数据结构的话,很遗憾,我无法准确的描述,这就相当于你问我“凤凰是什么样子”,不过我可以告诉你孔雀的样子。常用的Hash表非常像一个十字数组,似乎十字数组又成为了众多读者的障碍,如果你暂时还不能理解的话,请你去翻阅Hash表的详细论述,当然你也可以在不久之后,在本处看到这些经典数据结构的精讲。 class Point{public:Point(){m_x = 0;m_y = 0;}Point(int x, int y){m_x = x;m_y = y;}public:int m_x;int m_y;};typedef CMap<const char*, const char*, Point, Point& CMapPnt; //请在使用之前定义int main(){Point elem1(1, 100), elem2(2, 200), elem3(3, 300), point; CMapPnt mp; // insert 3 elements into map, #1 mp.SetAt("1st", elem1); mp.SetAt("2nd", elem2); mp.SetAt("3th", elem3); // search a point named "2nd" from map #2 mp.Lookup("2nd", point); printf("2nd: m_x: %d, m_y: %d\n", point.m_x, point.m_y); // insert a new pair into map #3 Point elem4(4, 400); mp["4th"] = elem4; cout<<"count: "<<mp.GetCount()<<endl; // traverse the entire map #4 size_t index = 0; const char* pszKey; POSITION ps = mp.GetStartPosition(); while( ps ){mp.GetNextAssoc(ps, pszKey, point); printf("index: %d, m_x: %d, m_y: %d\n", ++index, point.m_x, point.m_y);}return 0;}代码中,我已经给出了一些注释,我同样建议读者们,用英文在代码中注释,这样的好处实在是太多了。尤其在代码需要在不同编码的操作系统上调试的时候。 遍历,看注释#4,至于POSITION的含义,请在本空间,查看其它文章。先使用GetStartPosition()函数获得表头的位置,然后,我们可以使用GetNextAssoc函数来遍历。GetNextAssoc(POSITION& rNextPosition, KEY& rKey, VALUE& rValue)函数的参数值得说明一下,大家看到,3个参数都是引用,而第一个是rNextPosition,顾名思义,在函数返回之后,它将会指像下一个元组,当然这是在表还未遍历完的时候,否则,它将被置为空(NULL)。 【】,利用下标取元素的这个操作符,在CMap中被重载,用来返回指定Key值数据的引用,不过在注释#3处,对于先取"4th"这个Point的引用然后赋值的用法,看起来,似乎有点聪明过了头,因为在这之前,我们还没有插入"4th"所对应的元组,但是,程序却能正常的运行!为什么?其实,这样的用法是十分正确的,因为CMap毕竟不是数组,它是没有边界的,当CMap在获得一个它无法查询到的Key值的时候,它会将这个Key以及一个空的数据类型追加到Hash表中去,从而保证了上面的程序可以无误的运行。 我们已经说过,ARG_KEY是作为类型参数传入CMap的,但并不是任何类型都可以作为ARG_KEY传入的。为什么?看样子,这次不得不简单的说说Hash表的散列函数了。每个Hash表,总会使用一些散列函数,用来查找Key所对应的Value,理想状态下,我们当然希望Hash表,就是一个数组,虽然这不可能,不过这样理解,可以帮助我们更好的理解Hash表的物理结构,就让我们暂时把它看成一个数组吧。数组总是使用下标来直接获取元素的存储地址,而下标,显然应该是个非负整数,从而Hash表,也应该具备这样的特性,至少必须存在某种算法可以使传入的Key可以直接的转化为一个非负的整数,这也就是ARG_KEY的选择标准。从而对象、引用无论如何都不应该作为ARG_KEY成为CMap的类型参数,而int、unsigned int、指针以及地址就成为了ARG_KEY的常用类型参数,其实也就是那些类似于整型的数据类型。常常看到一些人在用CMap的时候,试图使用CString作为CMap中ARG_KEY的类型参数,这是应该被纠正的方向性错误,但有些人似乎会理直气壮的反驳我,因为他们发现类型参数KEY是可以使用CString的,这很奇怪吗?我说过KEY不能使用CString吗?之所以KEY可以使用CString而ARG_KEY却用的是LPCTSTR,那是因为CString重载了operator==(const char*)这个判等操作符,当CMap从Hash表中获得KEY之后,它会将ARG_KEY与KEY直接相比较。真正存于CMap内部的是KEY,也就是CString。这也就是为什么,我们经常会看到CMap被实化成CMap<CString, LPCTSTR/*相当于const char*,非Unicode情况下*/, CString,CString&这样的一个四不像实化类的原因,至于CMap的效率优化问题,我们会在以后的文章中继续与大家探讨。
‘贰’ win10系统中怎么删除Adobe Reader残余文件夹CMap
工具:win10系统
步骤:
Adobe Reader装在D盘,D:Program FilesAdobeReader 11.0ResourceCMap,首先在D盘打开文件的属性。
‘叁’ CMap文件在D盘删除不了
如果遇到删不掉的文件该如何处理
大家是否有这样的经历:在删除某个文件时,系统会给出各种各样的提示,反正就是死活不让删。造成这种情况的原因主要有三种:一是文件正在被系统使用,二是文件名中包含系统无法识别的字符,三是用户权限不够。我们主要研究前两种情况,下面做了个整理,帮你解决这个问题。
一、基本型
1.分步删除。如果你删除的是一个文件夹,可以尝试先将文件夹中的文件删除,然后再删除该文件夹。还有一种办法是在该文件夹下面新建一个文件,再对文件夹执行删除操作。
2.改名删除。将不能删除的文件或文件夹改名后再删除.
3.结束进程再删除。当你在删除文件时,如果系统提示“文件正在使用”,首先检查一下是否没有退出与被删文件相关的程序,再看看系统进程中是否还有相关进程保留。这种情况常常出现在我们卸载软件后删除软件残留在系统中文件的时候。
4.重启后再删除.
5.换个系统再删除。使用多系统的朋友可以切换到另外一个系统中执行删除操作,这招比较有效。单系统的朋友则可以在DOS下使用RD(删除目录)或delete命令(删除文件)或者进入到安全模式底下进行删除操作.
6.结束掉Explorer进程后再删除。按下Ctrl+Alt+Del键打开任务管理器,切换到“进程”选项卡,结束掉Explorer进程,这时候桌面会丢失,不用着急,运行“文件→新任务”,输入“cmd”后回车打开命令行窗口,进入待删文件所在目 录,用RD或delete命令删除即可。删除完毕后再次运行“文件→新任务”命令,输入“explorer”后回车,桌面又回来了.
7.关闭预览功能再删除。如果你在资源管理器中使用了视频、图片的预览功能,那么在删除此类文件时常常不成功,解决的办法是关闭该功能:Windows XP用户在“开始→运行”中输入“regsvr32 /u shmedia.dll”即可,Windows 2000用户则在资源管理器中的空白处单击鼠标右键,选择“自定义文件夹”选项,会出现自定义文件夹向导,进入到“请选择模板”窗口后,选择其中的“简易”便可以禁止视频预览了。
二、移花接木型
1.覆盖文件再删除。在硬盘的另外区域新建一个和待删文件同名的文件,然后剪切并覆盖待删文件,最后再删除该文件.
2.请常用软件“兼职”删除。我们可以使用Winrar、FlashFXP、Nero、ACDSee来删除顽固文件,这种方法往往有奇效。使用方法非常简单,以FlashFXP为例,只需在本地目录中浏览到待删文件,对其执行删除操作即可.
注意:使用Winrar来删除文件的方法跟其它软件不同,步骤如下:右键单击待删除文件或者文件夹,选择“添加到档案文件”菜单,在谈出窗口中勾选“存档后删除源文件”,单击“确定”,这样Winrar在创建压缩文件的同时,也会帮我们删除顽固的文件,我们只 需要将创建的压缩文件删除即可.
3.在别的机器上删除。如果你处于局域网中,可以尝试将待删文件所在的文件夹的属性设置为共享,并赋予读写权限,然后通过网上邻居或在所在的局域网内的其它的电脑上打开文件夹,执行删除操作。另外如果你电脑中安装了FTP服务器,我们还可以试试从FTP登录 本机,然后删除待删文件.
4.使用专业删除软件。大名鼎鼎的PC Tools这款小软件可以删除几乎所有“顽固”软件。运行软件后,先按任意键进入软件的主界面,然后按下F10并切换选中待删文件,按下D键并确认操作即可删除.
‘肆’ CMap 怎么使用自定义的类作为key
template<> UINT AFXAPI HashKey<FlashType::UndefinedType &>(FlashType::UndefinedType & key)
{
}
不能放到其他命名空间里面
‘伍’ 怎么用python显示一张图片
在 python 中除了用 opencv,也可以用 matplotlib 和 PIL 这两个库操作图片。本人偏爱 matpoltlib,因为它的语法更像 matlab。
一、matplotlib
1. 显示图片
复制代码
import matplotlib.pyplot as plt # plt 用于显示图片
import matplotlib.image as mpimg # mpimg 用于读取图片
import numpy as np
lena = mpimg.imread('lena.png') # 读取和代码处于同一目录下的 lena.png
# 此时 lena 就已经是一个 np.array 了,可以对它进行任意处理
lena.shape #(512, 512, 3)
plt.imshow(lena) # 显示图片
plt.axis('off') # 不显示坐标轴
plt.show()
复制代码
2. 显示某个通道
复制代码
# 显示图片的第一个通道
lena_1 = lena[:,:,0]
plt.imshow('lena_1')
plt.show()
# 此时会发现显示的是热量图,不是我们预想的灰度图,可以添加 cmap 参数,有如下几种添加方法:
plt.imshow('lena_1', cmap='Greys_r')
plt.show()
img = plt.imshow('lena_1')
img.set_cmap('gray') # 'hot' 是热量图
plt.show()
复制代码
3. 将 RGB 转为灰度图
matplotlib 中没有合适的函数可以将 RGB 图转换为灰度图,可以根据公式自定义一个:
复制代码
def rgb2gray(rgb):
return np.dot(rgb[...,:3], [0.299, 0.587, 0.114])
gray = rgb2gray(lena)
# 也可以用 plt.imshow(gray, cmap = plt.get_cmap('gray'))
plt.imshow(gray, cmap='Greys_r')
plt.axis('off')
plt.show()
复制代码
4. 对图像进行放缩
这里要用到 scipy
复制代码
from scipy import misc
lena_new_sz = misc.imresize(lena, 0.5) # 第二个参数如果是整数,则为百分比,如果是tuple,则为输出图像的尺寸
plt.imshow(lena_new_sz)
plt.axis('off')
plt.show()
复制代码
5. 保存图像
5.1 保存 matplotlib 画出的图像
该方法适用于保存任何 matplotlib 画出的图像,相当于一个 screencapture。
plt.imshow(lena_new_sz)
plt.axis('off')
plt.savefig('lena_new_sz.png')
5.2 将 array 保存为图像
from scipy import misc
misc.imsave('lena_new_sz.png', lena_new_sz)
5.3 直接保存 array
读取之后还是可以按照前面显示数组的方法对图像进行显示,这种方法完全不会对图像质量造成损失
np.save('lena_new_sz', lena_new_sz) # 会在保存的名字后面自动加上.npy
img = np.load('lena_new_sz.npy') # 读取前面保存的数组
二、PIL
1. 显示图片
from PIL import Image
im = Image.open('lena.png')
im.show()
2. 将 PIL Image 图片转换为 numpy 数组
im_array = np.array(im)
# 也可以用 np.asarray(im) 区别是 np.array() 是深拷贝,np.asarray() 是浅拷贝
3. 保存 PIL 图片
直接调用 Image 类的 save 方法
from PIL import Image
I = Image.open('lena.png')
I.save('new_lena.png')
4. 将 numpy 数组转换为 PIL 图片
这里采用 matplotlib.image 读入图片数组,注意这里读入的数组是 float32 型的,范围是 0-1,而 PIL.Image 数据是 uinit8 型的,范围是0-255,所以要进行转换:
import matplotlib.image as mpimg
from PIL import Image
lena = mpimg.imread('lena.png') # 这里读入的数据是 float32 型的,范围是0-1
im = Image.fromarray(np.uinit8(lena*255))
im.show()
5. RGB 转换为灰度图
from PIL import Image
I = Image.open('lena.png')
I.show()
L = I.convert('L')
L.show()
‘陆’ MFC Map的使用。。。
定义错误
不知道你把 KEY定义成字符串指针啥意思?
map 是键值对的方式存储的。
如果要指针,需全局变量的地址。估计你用的函数内的局部变量地址了
CMap< CString, LPCTSTR, CString, LPCTSTR>
‘柒’ matlab colourmap怎么用
先用imshow或者image把图片显示出来,再用colormap设置图像的颜色;
常用的配色有jet、hot、gray等等。
用法:colormapxxx
‘捌’ CMap<CString, LPCTSTR, int, int> m_mpKeyword 解释下用法和参数
CMap不能用CString作为键类型,推荐使用std::map。
‘玖’ photoshop怎样用阿
以下是PS的快捷键,你可以先记熟,在结合PS教程 应该很快就能熟练运用了
希望给个最佳。
工具箱(多种工具共用一个快捷键的可同时按【Shift】加此快捷键选取)
矩形、椭圆选框工具 【M】
裁剪工具 【C】
移动工具 【V】
套索、多边形套索、磁性套索 【L】
魔棒工具 【W】
喷枪工具 【J】
画笔工具 【B】
像皮图章、图案图章 【S】
历史记录画笔工具 【Y】
像皮擦工具 【E】
铅笔、直线工具 【N】
模糊、锐化、涂抹工具 【R】
减淡、加深、海棉工具 【O】
钢笔、自由钢笔、磁性钢笔 【P】
添加锚点工具 【+】
删除锚点工具 【-】
直接选取工具 【A】
文字、文字蒙板、直排文字、直排文字蒙板 【T】
度量工具 【U】
直线渐变、径向渐变、对称渐变、角度渐变、菱形渐变 【G】
油漆桶工具 【K】
吸管、颜色取样器 【I】
抓手工具 【H】
缩放工具 【Z】
默认前景色和背景色 【D】
切换前景色和背景色 【X】
切换标准模式和快速蒙板模式 【Q】
标准屏幕模式、带有菜单栏的全屏模式、全屏模式 【F】
临时使用移动工具 【Ctrl】
临时使用吸色工具 【Alt】
临时使用抓手工具 【空格】
打开工具选项面板 【Enter】
快速输入工具选项(当前工具选项面板中至少有一个可调节数字) 【0】至【9】
循环选择画笔 【[】或【]】
选择第一个画笔 【Shift】+【[】
选择最后一个画笔 【Shift】+【]】
建立新渐变(在”渐变编辑器”中) 【Ctrl】+【N】
文件操作
新建图形文件 【Ctrl】+【N】
用默认设置创建新文件 【Ctrl】+【Alt】+【N】
打开已有的图像 【Ctrl】+【O】
打开为... 【Ctrl】+【Alt】+【O】
关闭当前图像 【Ctrl】+【W】
保存当前图像 【Ctrl】+【S】
另存为... 【Ctrl】+【Shift】+【S】
存储副本 【Ctrl】+【Alt】+【S】
页面设置 【Ctrl】+【Shift】+【P】
打印 【Ctrl】+【P】
打开“预置”对话框 【Ctrl】+【K】
显示最后一次显示的“预置”对话框 【Alt】+【Ctrl】+【K】
设置“常规”选项(在预置对话框中) 【Ctrl】+【1】
设置“存储文件”(在预置对话框中) 【Ctrl】+【2】
设置“显示和光标”(在预置对话框中) 【Ctrl】+【3】
设置“透明区域与色域”(在预置对话框中) 【Ctrl】+【4】
设置“单位与标尺”(在预置对话框中) 【Ctrl】+【5】
设置“参考线与网格”(在预置对话框中) 【Ctrl】+【6】
外发光效果(在”效果”对话框中) 【Ctrl】+【3】
内发光效果(在”效果”对话框中) 【Ctrl】+【4】
斜面和浮雕效果(在”效果”对话框中) 【Ctrl】+【5】
应用当前所选效果并使参数可调(在”效果”对话框中) 【A】
图层混合模式
循环选择混合模式 【Alt】+【-】或【+】
正常 【Ctrl】+【Alt】+【N】
阈值(位图模式) 【Ctrl】+【Alt】+【L】
溶解 【Ctrl】+【Alt】+【I】
背后 【Ctrl】+【Alt】+【Q】
清除 【Ctrl】+【Alt】+【R】
正片叠底 【Ctrl】+【Alt】+【M】
屏幕 【Ctrl】+【Alt】+【S】
叠加 【Ctrl】+【Alt】+【O】
柔光 【alt】+【shit】+【F】
强光 【Ctrl】+【Alt】+【H】
颜色减淡 【Ctrl】+【Alt】+【D】
颜色加深 【Ctrl】+【Alt】+【B】
变暗 【Ctrl】+【Alt】+【K】
变亮 【Ctrl】+【Alt】+【G】
差值 【Ctrl】+【Alt】+【E】
排除 【Ctrl】+【Alt】+【X】
色相 【Ctrl】+【Alt】+【U】
饱和度 【Ctrl】+【Alt】+【T】
颜色 【Ctrl】+【Alt】+【C】
光度 【Ctrl】+【Alt】+【Y】
去色 海棉工具+【Ctrl】+【Alt】+【J】
加色 海棉工具+【Ctrl】+【Alt】+【A】
暗调 减淡/加深工具+【Ctrl】+【Alt】+【W】
中间调 减淡/加深工具+【Ctrl】+【Alt】+【V】
高光 减淡/加深工具+【Ctrl】+【Alt】+【Z】
选择功能
全部选取 【Ctrl】+【A】
取消选择 【Ctrl】+【D】
重新选择 【Ctrl】+【Shift】+【D】
羽化选择 【Ctrl】+【Alt】+【D】
反向选择 【Ctrl】+【Shift】+【I】
路径变选区 数字键盘的【Enter】
载入选区 【Ctrl】+点按图层、路径、通道面板中的缩约图
滤镜
按上次的参数再做一次上次的滤镜 【Ctrl】+【F】
退去上次所做滤镜的效果 【Ctrl】+【Shift】+【F】
重复上次所做的滤镜(可调参数) 【Ctrl】+【Alt】+【F】
选择工具(在“3D变化”滤镜中) 【V】
立方体工具(在“3D变化”滤镜中) 【M】
球体工具(在“3D变化”滤镜中) 【N】
柱体工具(在“3D变化”滤镜中) 【C】
轨迹球(在“3D变化”滤镜中) 【R】
全景相机工具(在“3D变化”滤镜中) 【E】
视图操作
显示彩色通道 【Ctrl】+【~】
显示单色通道 【Ctrl】+【数字】
显示复合通道 【~】
以CMYK方式预览(开) 【Ctrl】+【Y】
打开/关闭色域警告 【Ctrl】+【Shift】+【Y】
放大视图 【Ctrl】+【+】
缩小视图 【Ctrl】+【-】
满画布显示 【Ctrl】+【0】
实际象素显示 【Ctrl】+【Alt】+【0】
向上卷动一屏 【PageUp】
向下卷动一屏 【PageDown】
向左卷动一屏 【Ctrl】+【PageUp】
向右卷动一屏 【Ctrl】+【PageDown】
向上卷动10 个单位 【Shift】+【PageUp】
向下卷动10 个单位 【Shift】+【PageDown】
向左卷动10 个单位 【Shift】+【Ctrl】+【PageUp】
向右卷动10 个单位 【Shift】+【Ctrl】+【PageDown】
将视图移到左上角 【Home】
将视图移到右下角 【End】
显示/隐藏选择区域 【Ctrl】+【H】
显示/隐藏路径 【Ctrl】+【Shift】+【H】
显示/隐藏标尺 【Ctrl】+【R】
显示/隐藏参考线 【Ctrl】+【;】
显示/隐藏网格 【Ctrl】+【”】
贴紧参考线 【Ctrl】+【Shift】+【;】
锁定参考线 【Ctrl】+【Alt】+【;】
贴紧网格 【Ctrl】+【Shift】+【”】
显示/隐藏“画笔”面板 【F5】
显示/隐藏“颜色”面板 【F6】
显示/隐藏“图层”面板 【F7】
显示/隐藏“信息”面板 【F8】
显示/隐藏“动作”面板 【F9】
显示/隐藏所有命令面板 【TAB】
显示或隐藏工具箱以外的所有调板 【Shift】+【TAB】
文字处理(在”文字工具”对话框中)
左对齐或顶对齐 【Ctrl】+【Shift】+【L】
中对齐 【Ctrl】+【Shift】+【C】
右对齐或底对齐 【Ctrl】+【Shift】+【R】
左/右选择 1 个字符 【Shift】+【←】/【→】
下/上选择 1 行 【Shift】+【↑】/【↓】
选择所有字符 【Ctrl】+【A】
选择从插入点到鼠标点按点的字符 【Shift】加点按
左/右移动 1 个字符 【←】/【→】
下/上移动 1 行 【↑】/【↓】
左/右移动1个字 【Ctrl】+【←】/【→】
将所选文本的文字大小减小2 点象素 【Ctrl】+【Shift】+【<】
将所选文本的文字大小增大2 点象素 【Ctrl】+【Shift】+【>】
将所选文本的文字大小减小10 点象素 【Ctrl】+【Alt】+【Shift】+【<】
将所选文本的文字大小增大10 点象素 【Ctrl】+【Alt】+【Shift】+【>】
将行距减小2点象素 【Alt】+【↓】
将行距增大2点象素 【Alt】+【↑】
将基线位移减小2点象素 【Shift】+【Alt】+【↓】
将基线位移增加2点象素 【Shift】+【Alt】+【↑】
将字距微调或字距调整减小20/1000ems 【Alt】+【←】
将字距微调或字距调整增加20/1000ems 【Alt】+【→】
将字距微调或字距调整减小100/1000ems 【Ctrl】+【Alt】+【←】
将字距微调或字距调整增加100/1000ems 【Ctrl】+【Alt】+【→】
设置“增效工具与暂存盘”(在预置对话框中) 【Ctrl】+【7】
设置“内存与图像高速缓存”(在预置对话框中) 【Ctrl】+【8】
编辑操作
还原/重做前一步操作 【Ctrl】+【Z】
还原两步以上操作 【Ctrl】+【Alt】+【Z】
重做两步以上操作 【Ctrl】+【Shift】+【Z】
剪切选取的图像或路径 【Ctrl】+【X】或【F2】
拷贝选取的图像或路径 【Ctrl】+【C】
合并拷贝 【Ctrl】+【Shift】+【C】
将剪贴板的内容粘到当前图形中 【Ctrl】+【V】或【F4】
将剪贴板的内容粘到选框中 【Ctrl】+【Shift】+【V】
自由变换 【Ctrl】+【T】
应用自由变换(在自由变换模式下) 【Enter】
从中心或对称点开始变换 (在自由变换模式下) 【Alt】
限制(在自由变换模式下) 【Shift】
扭曲(在自由变换模式下) 【Ctrl】
取消变形(在自由变换模式下) 【Esc】
自由变换复制的象素数据 【Ctrl】+【Shift】+【T】
再次变换复制的象素数据并建立一个副本 【Ctrl】+【Shift】+【Alt】+【T】
删除选框中的图案或选取的路径 【DEL】
用背景色填充所选区域或整个图层 【Ctrl】+【BackSpace】或【Ctrl】+【Del】
用前景色填充所选区域或整个图层 【Alt】+【BackSpace】或【Alt】+【Del】
弹出“填充”对话框 【Shift】+【BackSpace】
从历史记录中填充 【Alt】+【Ctrl】+【Backspace】
图像调整
调整色阶 【Ctrl】+【L】
自动调整色阶 【Ctrl】+【Shift】+【L】
打开曲线调整对话框 【Ctrl】+【M】
在所选通道的曲线上添加新的点(‘曲线’对话框中) 在图象中【Ctrl】加点按
在复合曲线以外的所有曲线上添加新的点(‘曲线’对话框中) 【Ctrl】+【Shift】
加点按
移动所选点(‘曲线’对话框中) 【↑】/【↓】/【←】/【→】
以10点为增幅移动所选点以10点为增幅(‘曲线’对话框中) 【Shift】+【箭头】
选择多个控制点(‘曲线’对话框中) 【Shift】加点按
前移控制点(‘曲线’对话框中) 【Ctrl】+【Tab】
后移控制点(‘曲线’对话框中) 【Ctrl】+【Shift】+【Tab】
添加新的点(‘曲线’对话框中) 点按网格
删除点(‘曲线’对话框中) 【Ctrl】加点按点
取消选择所选通道上的所有点(‘曲线’对话框中) 【Ctrl】+【D】
使曲线网格更精细或更粗糙(‘曲线’对话框中) 【Alt】加点按网格
选择彩色通道(‘曲线’对话框中) 【Ctrl】+【~】
选择单色通道(‘曲线’对话框中) 【Ctrl】+【数字】
打开“色彩平衡”对话框 【Ctrl】+【B】
打开“色相/饱和度”对话框 【Ctrl】+【U】
全图调整(在色相/饱和度”对话框中) 【Ctrl】+【~】
只调整红色(在色相/饱和度”对话框中) 【Ctrl】+【1】
只调整黄色(在色相/饱和度”对话框中) 【Ctrl】+【2】
只调整绿色(在色相/饱和度”对话框中) 【Ctrl】+【3】
只调整青色(在色相/饱和度”对话框中) 【Ctrl】+【4】
只调整蓝色(在色相/饱和度”对话框中) 【Ctrl】+【5】
只调整洋红(在色相/饱和度”对话框中) 【Ctrl】+【6】
去色 【Ctrl】+【Shift】+【U】
反相 【Ctrl】+【I】
图层操作
从对话框新建一个图层 【Ctrl】+【Shift】+【N】
以默认选项建立一个新的图层 【Ctrl】+【Alt】+【Shift】+【N】
通过拷贝建立一个图层 【Ctrl】+【J】
通过剪切建立一个图层 【Ctrl】+【Shift】+【J】
与前一图层编组 【Ctrl】+【G】
取消编组 【Ctrl】+【Shift】+【G】
向下合并或合并联接图层 【Ctrl】+【E】
合并可见图层 【Ctrl】+【Shift】+【E】
盖印或盖印联接图层 【Ctrl】+【Alt】+【E】
盖印可见图层 【Ctrl】+【Alt】+【Shift】+【E】
将当前层下移一层 【Ctrl】+【[】
将当前层上移一层 【Ctrl】+【]】
将当前层移到最下面 【Ctrl】+【Shift】+【[】
将当前层移到最上面 【Ctrl】+【Shift】+【]】
激活下一个图层 【Alt】+【[】
激活上一个图层 【Alt】+【]】
激活底部图层 【Shift】+【Alt】+【[】
激活顶部图层 【Shift】+【Alt】+【]】
调整当前图层的透明度(当前工具为无数字参数的,如移动工具) 【0】至【9】
保留当前图层的透明区域(开关) 【/】
投影效果(在”效果”对话框中) 【Ctrl】+【1】
内阴影效果(在”效果”对话框中) 【Ctrl】+【2】
F1 -帮助
F2 -剪切
F3 -拷贝
F4-粘贴
F5-隐藏/显示画笔面板
F6-隐藏/显示颜色面板
F7-隐藏/显示图层面板
F8-隐藏/显示信息面板
F9-隐藏/显示动作面板
F12-恢复
Shift+f5-填充
Shift+f6-羽化
Shift+f7-选择→反选
ctrl+h-隐藏选定区域
ctrl+d-取消选定区域
ctrl+w-关闭文件
ctrl+Q-退出PHOTOSHOP
Esc-取消操作
2.按Tab键可以显示或隐藏工具箱和调色板,按"shift+Tab"键可以显示或隐藏除工具以外的其他面板。
3.按住shift用绘画工具在画面点击就可以在每两点间画出直线,按住鼠标拖动便可画出水平或垂直线。
4.使用其他工具时,按住ctrl键可切换到move工具的功能(除了选择hand工具时)按住空格键可切换到hand工具的功能。
5.同时按住alt和ctrl+或-可让画框与画面同时缩放。
6.使用其他工具时,按ctrl+空格键可切换到zoom in工具放大图象显示比例,按alt+ctrl+空格可切换到zoom out工具缩小图象显示比例。
7.在hand工具上双击鼠标可以使图象匹配窗口的大小显示。
8.按住alt双击photoshop底板相当于open as。
9.按住shife双击photoshop底板相当于save。
10.按住ctrl双击photoshop底板相当于new file。
11.按住ale点击工具盒中带小点的工具可循环选择隐藏的工具。
12.按ctrl+alt+{数字键0}或在zoom工具上双击鼠标可使图象文件以1:1比例显示。
13.在各种设置框内,只要按住alt键,cancel键会变成键reset键,按reset键变可恢复默认设置。
14.按shift+backspace键可直接调用fill填充对话框。
15.按alt+backspace(delete)键可将前景色填入选取框按ctrl+backspace(delete)键可将背景色填入选取框。
16.同时按住ctrl和alt移动可马上复制到新的layer并可同时移动物体。
17.再用裁切工具裁切图片并调整裁切点时按住ctrl便不会贴近画面边缘。
18.若要在一个宏(action)中的某一命令后新增一条命令,可以先选中该命令,然后单击调色板上的开始录制(begin recording)图标,选择要增加的命令,再单击停止录制(stop recording)图标即可。
19.在layers,channels,paths面板上,按alt单击,按单击这些面板底部的工具图标时,对于有对话的工20.在使用filter→render→lighting effectts滤镜时,若要在对话框内复制光源,可先按住alt键后再拖动光源即可实现复制。
21.调用curves对话框时,按住键于格线内单击鼠标可以增加网格线,提高曲线精度。
22.若要在两上窗口间拖放拷贝,拖动过程中按住shift键,图像拖动到目的窗口后会自动居中。
23.按住shift选择区域时可在原区域上增加新的区域;按住alt选择区域时,可在原区域上减去新选区域,同时按住shift和alt选择区域时,可取得与原选择区域相交的部分
24.移动图层和选取框时,按住shift键可做水平,垂直或45度角的移动,按键盘上的方向键,可做每次1像素的移动,按住shift键再键盘上的方向键可做每次10像素的移动。
25.使用笔形工具制作路径是按住shift键可以强制路径或方向线成水平或垂直或45度角按住ctrl键可暂时切换到路径选取工具按住alt键将笔形光标在黑色的接点上单击可以改变方向线的方向,使曲线可以转折;按alt键用路径选取(direct selection)工具单击路径会选取整个路径,要同时选取多个路径可按住shift后逐个单击,用路径选取工具是按住ctrl+alt键移近路径会切换到加节点与件节点的笔行工具。
26.在使用选取工具时,按shift键拖动鼠标可以在原选取框外增加选取范围;同时按shift与alt键拖动鼠标可以选取与原选取框重叠的范围(交集)。
27.ctrl+delete加填前景颜色,ctrl或shift加delete填背景颜色。
28.空格加ctrl(注意顺序)快速调出放大镜, 再加alt变成缩小镜。
29.若要将图像用于网面上,可将图像模式设置为indexed color索引色彩模式,有文件小,传输快的优点, 如果再选择gif89a export(gif输出),可以设置透明的效果,并将文件保存成gif格式。
30.使用filter→render→clouds滤镜时,先按住alt可加云彩的反差,先按住shift键则降低反差 。
31.双击放大镜可使画面以的100%比例显示大小。
32.按ctrl+r 出现标尺,在标尺拉出辅助线时按住就可以准确的让辅助线贴近刻度。
33.在使用自由变形(layer→free→transform)功能时,按ctrl键并拖动某一控制点可以进行随意变形的调整,"shift+ctrl"键并拖动某一控制点可以时行倾斜调整;按alt键并拖动某一控制点可以进行对称调整;按shift+ctrl+alt键并拖动某一控制点可以进行透视效果的调整。
34.在photoshop5.0以上版本中右键点击文字,在layer选effects...可快速做出随字体改变的阴影及光芒效果。
35.在安装photoshop的时候在select country中选择all other countries;在select components中确定选择了cmap files;这样安装完后,您的photoshop就可以正常使用中文了。
36.在photoshop5.0中在history控制面板中点右上角的小三角选clear history可以暂时缓解你对虚拟内存的要求。
37.在使用filter→render→clouds滤镜时,若要产生更多明显的纹理图案,可先按住alt键后再执行该命令。
38.大部分工具在使用时按caps lock键可使工具图标与精 确十线相互切换。
39.按f键可把photoshop面板的显示模式顺序替换为:标准显示 带菜单的全屏显示 全屏显示。
40.想从中心开始画选框可按住alt拖动。
41.按住shift加上tab键可以显示或隐藏除工具 箱外的其他调色板
‘拾’ CArray,CList,CMap如何实化
CMap<CString, LPCTSTR, CString, LPCTSTRm_ItemMap; CString strKey = _T(""), str = _T("");int i;for(i = 0; i < 5; i++){strKey.Format("%d", i);//这个是键str.Format("A%d", i); //键对应的值m_ItemMap.SetAt(strKey, str);}2、遍历整个CMap的常用方法。 POSITION pos = m_ItemMap.GetStartPosition();while(pos){m_ItemMap.GetNextAssoc(pos, strKey, str); cout<< strKey<< ":"<< str<< endl;}3、在CMAP中查找相应的数据项。 CString pReset; if(m_ItemMap.Lookup("1", pReset)){cout<<pReset<<endl;}哎,这是乎又是一篇没有什么技术含量的应用性文章,但我,又能怎么样?虽然,我们在《CMap如何使用,用法举例》中,已经非常详细的说明了CMap参数的用法,也在其他的专题中介绍过了其它模板类的实化过程,不过我还是担心是否每个人都有足够的耐心去看完那些蜿蜒之天际的文章。所以,我们把CArray、CList以及CMap的参数问题独立出来,在此着重的讲解一番。 还是先看一个简单的实化例子吧: typdedef CMap<CString, LPCTSTR ,CString, CString&CStrMap;显然,向这样的用法,是无可厚非的,就像我们国家的中医,在经过无数次致命的尝试之后,得到了这个不再苦涩的,似乎也可以包治百病的灵丹妙药。可是,这毕竟是个令人心惊胆战的用法,尤其对于那些并不熟悉并试图熟悉CMap的小家伙们。我们还是先来看看CMap类型参数列表吧: template<class KEY, class ARG_KEY, class VALUE, class ARG_VALUE 我们看到在CMap中,类型参数ARG_KEY的引参是 LPCTSTR,而与之对应的KEY的引参却又是CString,它们是如此的固执,既然都指代了同样的内容,为什么又偏偏将对方视若不见呢?其实,这与CMap的内部实现存在着密不可分的关系,由于在CMap的内部,建立了一个Hash表,所以,必须将所有的传入参数置换为类似于int类型的整数,这样才可以符合散列函数的参数类型,否则CMap在编译时会报错。那么又是为什么?我们可以将ARG_KEY使用LPCTSTR来实化呢?其实,这又牵扯到了Hash表的实现问题,当然其中也包含了CString的实现问题。我们知道,存储在CStrMap内部的KEY仍然是CString,而我们对Hash表的操作,无非也就是给出一个整型的数,然后根据散列函数来寻找一个存储地址而已,尤其,当我们使用operator[]操作符的时候,如果我们给定的KEY所对应的VALUE并不存在的话,CMap会自动的为我们生成一个相应的元组,而如果你继而对它赋值的话,它会将ARG_KEY直接赋值给KEY,而这里就涉及到KEY的赋值构造函数了(其实,我更想叫它赋值操作符),现在我们使用的KEY是CString,而我们却要将一个LPCTSTR赋值于它,所以,我们就必须重载这个函数,其实也就是这样的一个函数: CString& operator=(LPCTSTR lpsz); 显然,这立即解决了我们的问题,不过,这仅仅是从逻辑功能层面,如果你传入的KEY是个很长的字符串的话,那么必然会对CStrMap的性能造成影响,其实这样的隐患也同样存在于VALUE身上,乃至其它类似的模板类上,这不得不引起我们的足够重视!C++ ,这门完美的近乎没有任何瑕疵的OOP语言,无疑就是闪耀星空的旷世巨献,然而,这似乎并没有引起每个人的共鸣。C++从C中的诞生,似乎就注定了,它永远都不可能像JAVA那样血统纯正,我不得不承认,它并非一个严格意义上的OOP(Oriented-object language,面向对象设计语言),然而就是这种近乎不合理的缺陷,却又造就了它近乎不合理的适应性,我是向来瞧不起解释性语言的,因为我本人就编写过脚本的解释器,实践证明,它们的效率要远远的落后于编译性语言,虽然它们常常号称自己如何的平台无关,如何的小而强大。 但,对于绝大多数的程序员来说,JAVA的确有很多的优势,也许其中之一,便是简单易学,其实这似乎更像一个借口。指针一度是困扰相当一部分程序员的暗物质,而C++更将这种震慑发挥到极致。显然C++的确很难,难到令这个世界上,至少50%以上的程序员,望而却步。然而一个几乎包罗万象的程序设计语言,几乎能容忍一切的全能语言,它到底有着什么样的魔力,却令另外50%的人如此的钟意,如此的着迷? 偏题三千里,言归正传。 至于C++的性能,似乎一直被OOP的性格所掩盖,而OOP主张的面向对象编程,更让许多窃窃私语的程序员有了足够的底气发言,同时他们宣称,C++显然就是应该由对象统治的世界,其实--大错特错,简直错的一败涂地。C++,归根结底,还是由指针执政,以致我们可以直接的操纵内存,直接和系统底层会话,并且还能实现我们空前强大的令人炫目的多态。所以,我们必须要利用这个得天独厚的资源。 偏题一千里,再言归正传。 在程序中使用指针,几乎可以使你的程序恢复到C的性能级别,显然我不会回避你正在思考命题,不错,C的性能的确要高于C++,而汇编语言的性能显然要进一步的高于C,只要学过一点编译原理的人,应该不会反对这个早已过时的辩论焦点。关键在于,从C过度到C++,已经是一种编程思维的转变。然而很多人,既没有继承C的高性能性,又未能领悟C++的封装、继承与多态性,却妄图从C直接飞到C++上,却被挂在了C与C++的中间,左右为难,大概停留到了C+这门语言去了。 言归正传。 我们在定义函数的时候,应该尽可能的少传对象,而更应该传指针或者引用,我们知道对于编译器内部来说,引用其实就是一个指针。这最主要的原因是,我们不必再为函数参数的圧栈而苦恼不已;同样,我们也不应该在函数结束之后,用对象来返回,这同样增加了函数圧栈的开销,而更应该适可的返回一个指针或者一个引用,当然,这样的指针和引用,绝对不能指向一个函数体内的临时对象。然而传入CMap中的类型参数,到底应该是什么,这似乎已经上升到了算法的层次,从而使我们对于实化本身的讨论变的毫无意义。 我也许会主张,将CMap实化成这种模样: typedef CMap<CString*, CString*, CString*, CString* CStrPtrMap; 个中缘由,当然还是出于对效率的考虑,我们在SetAt之前先new出一个CString对象,然后将其填入CStrPtrMap,这样的好处在于我们在SetAt的时候不需要去调用CString的赋值构造函数,而仅仅作简单的数据拷贝,这样的行为几乎适合所有的复杂数据结构,包括类,结构体。当然,唯一不能忘记的是,必须在必要的时候释放那些new出来的CString对象,否则,将会导致严重的内存泄露! typedef CMap<CString, LPCTSTR, CString*, CString* CStrPtrMap; 啊,这又是一个长着人身猪脸的八戒啊!不过,既然要去西天取经,八戒就八戒吧。 当然,千叮万嘱的还是,别忘记释放为CString*申请的内存!