精华内容
下载资源
问答
  • 很长时间没有接触MFC相关的知识了,我大概是在大二时候学习的MFC... 这篇文章主要是回顾以前的MFC基础知识,给对话框添加背景图片和给按钮button添加背景图片;希望此篇基础性文章对大家有所帮助!同时为下次做MFC相...

            很长时间没有接触MFC相关的知识了,我大概是在大二时候学习的MFC相关知识及图像处理,现在由于要帮个朋友完成个基于C++的程序,所以又回顾了下相关知识。的确,任何知识一段时间过后都比较容易忘记,但回顾起来还是很有印象的。
            这篇文章主要是回顾以前的MFC基础知识,给对话框添加背景图片和给按钮button添加背景图片;希望此篇基础性文章对大家有所帮助!同时为下次做MFC相关知识提供点此时所想所感吧。内容比较简单,高手飘过~

    一. 对话框背景添加图片

            首先通过VS2012创建MFC对话框应用程序,项目名为RecoveryMovie;然后在资源视图中打开Dialog,即IDD_RECOVERYMOVIE_DIALOG,再编辑对话框删除默认内容。
            第二步右键“资源视图”中的项目名称,添加资源。

     

            第三步添加选择Bitmap导入图片,图片文件最好放在项目res目录中,同时是BMP格式图片。上传后的图片如下图所示IDB_BITMAP1。

      

            第四步打开“解决方案”中XXXDlg.cpp文件(该对话框对应的源文件),找到OnPaint()函数,修改else部分代码,如下:
    	else
    	{
    		//注释该语句:防止重复调用重画函数
    		//CDialogEx::OnPaint();
    
    		//添加代码对话框背景贴图
    		CPaintDC   dc(this);   
    		CRect   rect;   
    		GetClientRect(&rect);                                 //获取对话框长宽       
    		CDC   dcBmp;                                           //定义并创建一个内存设备环境
    		dcBmp.CreateCompatibleDC(&dc);                         //创建兼容性DC
    		CBitmap   bmpBackground;   
    		bmpBackground.LoadBitmap(IDB_BITMAP1);                 //载入资源中的IDB_BITMAP1图片
    		BITMAP   m_bitmap;                                     //图片变量                
    		bmpBackground.GetBitmap(&m_bitmap);                    //将图片载入位图中
    		CBitmap   *pbmpOld=dcBmp.SelectObject(&bmpBackground); //将位图选入临时内存设备环境  
    		//调用函数显示图片 StretchBlt显示形状可变
    		dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcBmp,0,0,
    			m_bitmap.bmWidth,m_bitmap.bmHeight,SRCCOPY);   	
    
    		/******************************************************/
    		/** StretchBlt()                                     **/
    		/** 参数x、y位图目标矩形左上角x、y的坐标值 居中      **/
    		/** nWidth、nHeigth位图目标矩形的逻辑宽度和高度      **/
    		/** pSrcDC表示源设备CDC指针                          **/
    		/** xSrc、ySrc表示位图源矩形的左上角的x、y逻辑坐标值 **/
    		/** dwRop表示显示位图的光栅操作方式                  **/
    		/** SRCCOPY用于直接将位图复制到目标环境中            **/
    		/******************************************************/
    	}


     
            此时运行程序即可显示背景图片,同时你拉伸对话框时可能会出现闪动Bug。
            因此你可以设置Dialog的属性Border为Dialog Frame(对话框外框),默认的Resizing是可以调控大小的。
            注意:如果图像出现失贞,添加代码如下:
    dc.SetStretchBltMode(COLORONCOLOR);// 若不设置这个模式,图片会严重失真
    dc.StrtchBlt....

    二. 按钮BUTTON添加背景图片

            首先在“资源视图”中给Dialog添加3个按钮,分别为IDC_BUTTON1、IDC_BUTTON2和IDC_BUTTON3,如下图所示:

            第二步按照前面的方法添加资源:按钮背景图片,即“播放视频”图片。添加后在资源视图中选中图片资源,点击属性可以修改ID值。如下图所示,把IDB_BITMAP2修改为IDB_StartMovie1。

     
            第三步通过快捷键(Ctrl+Shift+X或视图->类向导)打开“类向导”,选择类名为CRecoverMovieDlg,在成员变量中点击添加变量,如下图添加3个按钮的成员变量。

     

            此时你会发现在XXXDlg.cpp中函数DoDataExchange()中会自动增加下面DDX_Control()的代码:
    void CRecoveryMovieDlg::DoDataExchange(CDataExchange* pDX)
    {
    	CDialogEx::DoDataExchange(pDX);
    	DDX_Control(pDX, IDC_BUTTON1, m_buttonstart);
    	DDX_Control(pDX, IDC_BUTTON2, m_buttonfix);
    	DDX_Control(pDX, IDC_BUTTON3, m_buttonexit);
    }
            第四步在XXXDlg.cpp中找到初始化函数OnInitDialog(),在“// TODO:在此添加额外的初始化代码”中添加如下代码:
    	// TODO: 在此添加额外的初始化代码
    
    	//初始化窗口 设置窗口为500*500大小
    	MoveWindow(0,0,500,500);  
    
    	/*******************************************************************************/
    	/* (重点知识:实现按钮位置设置)                                                 */
    	/*    1.使用Ctrl+Shift+X打开类资源导向 增加开始\结束按钮的成员变量 Button型    */
    	/*    2.使用函数SetWindowPos()设置两个按钮的位置                               */
    	/*******************************************************************************/
    
    	/*******************************************************************************/
    	/* SetWindowPos()函数                                                          */
    	/*		参数:const CWnd* pWndInsertAfter,int x,int y,int cx,int cy,UINT nFlags */
    	/*      hwnd是窗口的句柄,x、y、cx、cy分别是窗口的x和y坐标、宽和高度           */
    	/*      hWndInsertAfter用来指定窗口的Z位置,代表深度.这个参数接受5种值:         */
    	/*  HWND_BOTTOM、 HWND_NOTOPMOST、HWND_TOP、HWND_TOPMOST或者另一个窗口的句柄   */
    	/*      wFlags用来指定附加的选项                                               */
    	/*******************************************************************************/
    
    	//窗口句柄设置为NULL SWP_SHOWWINDOW显示窗口  SWP_NOSIZE保持当前大小忽略cx\xy故设置为0
    	m_buttonstart.SetWindowPos(NULL,20,280,0,0,SWP_SHOWWINDOW|SWP_NOSIZE);   
    	m_buttonfix.SetWindowPos(NULL,20,325,0,0,SWP_SHOWWINDOW|SWP_NOSIZE);  
    	m_buttonexit.SetWindowPos(NULL,20,370,0,0,SWP_SHOWWINDOW|SWP_NOSIZE);  
    
    	//设置按钮属性 点击按钮背景图片变换
    	m_buttonstart.LoadBitmaps(IDB_StartMovie1,IDB_StartMovie2);
    	m_buttonfix.LoadBitmaps(IDB_StartMovie1,IDB_StartMovie2);
    	m_buttonexit.LoadBitmaps(IDB_StartMovie1,IDB_StartMovie2);
    
    	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
            此时你运行程序会出现如下错误:Error class "CButton"没有成员“LoadBitmaps”。函数LoadBitmaps()的功能是点击按钮实现两张背景图片的替换。

     
            第五步需要在XXXDlg.h头文件中把public成员变量CButton全部修改为CBitmapButton,如下图为修改第一个变量所示:

    // CRecoveryMovieDlg 对话框
    class CRecoveryMovieDlg : public CDialogEx
    {
    // 构造
    public:
    	CRecoveryMovieDlg(CWnd* pParent = NULL);	// 标准构造函数
    
    // 对话框数据
    	enum { IDD = IDD_RECOVERYMOVIE_DIALOG };
    
    	protected:
    	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV 支持
    
    // 实现
    protected:
    	HICON m_hIcon;
    
    	// 生成的消息映射函数
    	virtual BOOL OnInitDialog();
    	afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
    	afx_msg void OnPaint();
    	afx_msg HCURSOR OnQueryDragIcon();
    	DECLARE_MESSAGE_MAP()
    public:
    	CBitmapButton m_buttonstart;
    	CBitmapButton m_buttonfix;
    	CBitmapButton m_buttonexit;
    };
            第六步:此时虽然你能运行程序,但是按钮背景依然没有,因为你还需要分别设置三个按钮的属性“Owner Draw”为True,它指定按钮为所有者描述的按钮。
            运行结果如下图所示:

     


            最后希望文章对大家有所帮助,如果文章中有不足之处或错误的地方,还请海涵!个人推荐初学者尤其很多老师布置作业需要用MFC完成的可以学习,没有什么语言流行,它们都是贯通的,都需要一步一个脚印的去学习。
            (By:Eastmount 2015-4-27 深夜3点    http://blog.csdn.net/eastmount/

     

    展开全文
  • 七、图片(306行~335行) 基本样式 1、img-responsive:响应式图片,主要针对于响应式设计 2、img-rounded:圆角图片 3、img-circle:圆形图片 4、img-thumbnail:缩略图片 注:由于样式没有对图片做大小...

    七、图片(306行~335

    基本样式


    1img-responsive响应式图片,主要针对于响应式设计
    2img-rounded圆角图片
    3img-circle圆形图片
    4img-thumbnail缩略图片

    注:由于样式没有对图片做大小上的样式限制,所以在实际使用的时候,需要通过其他的方式来处理图片大小。比如说控制图片容器大小。(注意不可以通过css样式直接修改img图片的大小,这样操作就不响应了)

    Bootstrap框架中也为大家提供了近200个不同的icon图片,而这些图标都是使用CSS3@font-face属性配合字体来实现的icon效果。图标都是glyphicons.com这个商业网站提供的,并且免费授权给Bootstrap框架使用

    原理:实际上是利用特殊的字体,利用@font-face属性加载特殊字体实现(2357行~第2380)


    其他图标(也可引入Font Awesome使用




    八、网格系统

    Bootstrap框架在不同屏幕尺寸使用了不同的网格样式

       下面以中屏(970px)为例进行介绍


    1、基本结构


    注:   =》数据行(.row)必须包含在容器(.container)中,以便为其赋予合适的对齐方式和内距(padding).

      <div class="container">     <div class="row"></div>    </div>

           =》在行(.row)中可以添加列(.column),但列数之和不能超过平分的总列数12如:

    <div class="container">  <div class="row">  

     <div class="col-md-4"></div>   <div class="col-md-8"></div>

     </div></div>

    2、列偏移

    我们不希望相邻的两个列紧靠在一起,但又不想使用margin或者其他的技术手段来。这个时候就可以使用列偏移(offset功能来实现。只需要在列元素上添加类名col-md-offset-*(其中星号代表要偏移的列组合数),那么具有这个类名的列就会向右偏移


    3、列排序

    通过添加类名col-md-push-*”和“col-md-pull-*”,达到改变排列顺序(当缩小屏幕时,列排序不变,一般用不上)



    4、可嵌套使用(始终保证同一级列数总和为12)

    展开全文
  • 前一篇文章讲述了Android触屏setOnTouchListener实现突破缩放、移动、绘制和添加水印,继续我的"随手拍"项目完成给图片添加相框、圆形圆角显示图片和图像合成的功能介绍.我主要从三个方面进行讲述,首先如何通过assets...

        前一篇文章讲述了Android触屏setOnTouchListener实现突破缩放、移动、绘制和添加水印,继续我的"随手拍"项目完成给图片添加相框、圆形圆角显示图片和图像合成的功能介绍.希望文章对大家有所帮助.

    一. 打开图片和显示assets文件中图片

        首先,对XML中activity_main.xml进行布局,通过使用RelativeLayout相对布局完成(XML代码后面附).然后,在Mainctivity.java中public class MainActivity extends Activity函数添加代码如下,添加点击按钮监听事件:

    //控件 
    private Button openImageBn;            //打开图片
    private Button showImageBn;            //显示assets资源图片
    private Button showImageBn1;           //模式1加成
    private Button showImageBn2;           //模式2加成
    private Button roundImageBn;           //圆角图片
    private ImageView imageShow;           //显示图片
    //自定义变量
    private Bitmap bmp;                    //原始图片
    private final int IMAGE_OPEN = 0;      //打开图片
    private Canvas canvas;                 //画布
    private Paint paint;                   //画刷
    		
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    	//打开图片
    	openImageBn = (Button)findViewById(R.id.button1);
    	imageShow = (ImageView) findViewById(R.id.imageView1);
    	openImageBn.setOnClickListener(new OnClickListener() {
    		@Override
    		public void onClick(View v) {		 
    			Intent intent = new Intent(Intent.ACTION_PICK, 
    					android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    			startActivityForResult(intent, IMAGE_OPEN);
    		}
    	});
        if (savedInstanceState == null) {
            getFragmentManager().beginTransaction()
                    .add(R.id.container, new PlaceholderFragment())
                    .commit();
        }
    }
    //打开图片
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    	 super.onActivityResult(requestCode, resultCode, data);  
    	 if(resultCode==RESULT_OK && requestCode==IMAGE_OPEN) {  
        	Uri imageFileUri = data.getData();
        	DisplayMetrics dm = new DisplayMetrics();
        	getWindowManager().getDefaultDisplay().getMetrics(dm);  
            int width = dm.widthPixels;    //手机屏幕水平分辨率   
            int height = dm.heightPixels;  //手机屏幕垂直分辨率
    	    try {  
    	        //载入图片尺寸大小没载入图片本身 true
    	        BitmapFactory.Options bmpFactoryOptions = new BitmapFactory.Options();  
    	        bmpFactoryOptions.inJustDecodeBounds = true;  
    	        bmp = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageFileUri), null, bmpFactoryOptions);  
    	        int heightRatio = (int)Math.ceil(bmpFactoryOptions.outHeight/(float)height);  
    	        int widthRatio = (int)Math.ceil(bmpFactoryOptions.outWidth/(float)width);    
    	        //inSampleSize表示图片占原图比例 1表示原图
    	        if(heightRatio>1&&widthRatio>1) {  
    	            if(heightRatio>widthRatio) {  
    	                bmpFactoryOptions.inSampleSize = heightRatio;  
    	            }  
    	            else {  
    	                bmpFactoryOptions.inSampleSize = widthRatio;  
    	            }  
    	        }  		            
    	        //图像真正解码 false
    	        bmpFactoryOptions.inJustDecodeBounds = false;                 
    	        bmp = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageFileUri), null, bmpFactoryOptions);    
    	        imageShow.setImageBitmap(bmp);
    	    }
    	    catch(FileNotFoundException e) { 
    	        e.printStackTrace();  
    	    } 
    	}  //end if
    }

        上面点击"打开"按钮能实现打开图片,而在讲述为图片添加边框时,它其实就是通过两张或多张图片的合成实现的.
        在jacpy.may《Android图片处理总结》文档中建议图片不要放在drawable目录下,因为屏幕分辨率会影响图片的大小.最好放在assets目录里,它代表应用无法直接访问的原生资源(通常加载PNG透明图实现边框合成),只能以流的方式读取并且小于1M.
        读取assets文件夹中图片的方法如下,首先手动添加PNG图片至assets目录,然后在omCreate函数中添加如下代码:

    //显示assets中图片
    showImageBn = (Button)findViewById(R.id.button2);
    showImageBn.setOnClickListener(new OnClickListener() {
    	@Override
    	public void onClick(View v) {		 
    		Bitmap bitmap = getImageFromAssets("image01.png");
    		imageShow.setImageBitmap(bitmap);  
    	}
    });
       再通过自定义函数getImageFromAssets实现获取图片"image01.png":

    //获取assets中资源并转换为Bitmap
    private Bitmap getImageFromAssets(String fileName)
    {
    	//Android中使用assets目录存放资源,它代表应用无法直接访问的原生资源
    	Bitmap imageAssets = null;
    	AssetManager am = getResources().getAssets();
    	try {
    		InputStream is = am.open(fileName);
    		imageAssets = BitmapFactory.decodeStream(is);
    		is.close();
    	} catch(IOException e) {
    		e.printStackTrace();
    	}
    	return imageAssets;
    }
       显示效果如下图所示:
                 
       其中XML代码如下:

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context="com.example.touchimagetest.MainActivity"
        tools:ignore="MergeRootFrame" >
        <!-- 底部添加按钮 -->
        <RelativeLayout
            android:id="@+id/MyLayout_bottom"
            android:orientation="horizontal" 
            android:layout_width="fill_parent"
            android:layout_height="50dp"
            android:layout_alignParentBottom="true"
            android:gravity="center">
    	    <LinearLayout 
    	        android:layout_width="match_parent"
    	    	android:layout_height="match_parent"
    	    	android:orientation="horizontal"
    	    	android:layout_alignParentBottom="true" >
    			<Button
    				 android:id="@+id/button1"
    				 android:layout_width="wrap_content"
    				 android:layout_height="match_parent"
    				 android:layout_weight="1"
    				 android:text="打开" />
    			<Button
    				 android:id="@+id/button2"
    				 android:layout_width="wrap_content"
    				 android:layout_height="match_parent"
    				 android:layout_weight="1"
    				 android:text="显示" />
    			<Button
    				 android:id="@+id/button3"
    				 android:layout_width="wrap_content"
    				 android:layout_height="match_parent"
    				 android:layout_weight="1"
    				 android:text="边框" />
    			<Button
    				 android:id="@+id/button4"
    				 android:layout_width="wrap_content"
    				 android:layout_height="match_parent"
    				 android:layout_weight="1"
    				 android:text="桃心" />
    			<Button
    				 android:id="@+id/button5"
    				 android:layout_width="wrap_content"
    				 android:layout_height="match_parent"
    				 android:layout_weight="1"
    				 android:text="圆形" />
    	    </LinearLayout>
    	</RelativeLayout>
        <!-- 顶部显示图片 -->
        <RelativeLayout
            android:id="@+id/Content_Layout" 
            android:orientation="horizontal"
            android:layout_above="@id/MyLayout_bottom"
            android:layout_width="fill_parent" 
            android:layout_height="wrap_content"
          	android:layout_alignParentTop="true"
            android:background="#000000"
            android:gravity="center">
            <ImageView
    	        android:id="@+id/imageView1"
    	        android:layout_width="fill_parent"
    	        android:layout_height="fill_parent"
    	        android:layout_gravity="center_horizontal" />
        </RelativeLayout>
    </RelativeLayout>

    二. 添加相框与图片合成

        然后开始完成图片合成的工作,这里我采用两种方法完成.继续在onCreate函数中添加代码:
    //模式1合成图片
    showImageBn1 = (Button)findViewById(R.id.button3);
    showImageBn1.setOnClickListener(new OnClickListener() {
    	@Override
    	public void onClick(View v) {
    		Bitmap bitmap = getImageFromAssets("image01.png");
    		addFrameToImage(bitmap);
    	}
    });
       通过自定义函数addFrameToImage实现加载图片合成.首先创建一个空的可变为图对象,它的大小和配置与打开的图像相同,随后构建一个Canvas对象和一个Paint对象,在画布上绘制第一个位图对象,它成为了合成操作的目标.
        现在设置Paint对象上的过渡模式,通过传入一个定义操作模式的常量,实例化一个新的PorterDuffXfermode对象.然后在Canvas对象上绘制第二个位图对象,并将ImageView设置为新的位图对象.代码如下:
    //图片合成1
    private void addFrameToImage(Bitmap bm) //bmp原图(前景) bm资源图片(背景)
    {
    	Bitmap drawBitmap =Bitmap.createBitmap(bmp.getWidth(),
    			bmp.getHeight(), bmp.getConfig());
    	canvas = new Canvas(drawBitmap);
    	paint = new Paint();
    	canvas.drawBitmap(bmp, 0, 0, paint);
    	paint.setXfermode(new PorterDuffXfermode(android.
    			graphics.PorterDuff.Mode.LIGHTEN));
    	//对边框进行缩放
        int w = bm.getWidth();
        int h = bm.getHeight();
        //缩放比 如果图片尺寸超过边框尺寸 会自动匹配
        float scaleX = bmp.getWidth()*1F / w;      
        float scaleY = bmp.getHeight()*1F / h;
        Matrix matrix = new Matrix();
        matrix.postScale(scaleX, scaleY);   //缩放图片
        Bitmap copyBitmap =  Bitmap.createBitmap(bm, 0, 0, w, h, matrix, true);
    	canvas.drawBitmap(copyBitmap, 0, 0, paint);
    	imageShow.setImageBitmap(drawBitmap);	
    }
       第二种方法是参照《Android多媒体开发高级编程》,但是它图片十四合成效果不是很好:
    //模式2合成图片
    showImageBn2 = (Button)findViewById(R.id.button4);
    showImageBn2.setOnClickListener(new OnClickListener() {
    	@Override
    	public void onClick(View v) {
    		Bitmap bitmap = getImageFromAssets("image07.png");
    		//第二种合成方法
    		imageShow.setImageBitmap(addFrameToImageTwo(bitmap));
    	}
    });
        然后通过自定义函数实现:
    //图片合成	
    private Bitmap addFrameToImageTwo(Bitmap frameBitmap) //bmp原图 frameBitmap资源图片(边框)
    {
    	//bmp原图 创建新位图
    	int width = bmp.getWidth();  
        int height = bmp.getHeight();
        Bitmap drawBitmap =Bitmap.createBitmap(width, height, Config.RGB_565);
    	//对边框进行缩放
        int w = frameBitmap.getWidth();
        int h = frameBitmap.getHeight();
        float scaleX = width*1F / w;        //缩放比 如果图片尺寸超过边框尺寸 会自动匹配
        float scaleY = height*1F / h;
        Matrix matrix = new Matrix();
        matrix.postScale(scaleX, scaleY);   //缩放图片
        Bitmap copyBitmap =  Bitmap.createBitmap(frameBitmap, 0, 0, w, h, matrix, true);
        
        int pixColor = 0;  
        int layColor = 0;  
        int newColor = 0;
        
        int pixR = 0;  
        int pixG = 0;  
        int pixB = 0;  
        int pixA = 0;  
          
        int newR = 0;  
        int newG = 0;  
        int newB = 0;  
        int newA = 0;  
          
        int layR = 0;  
        int layG = 0;  
        int layB = 0;  
        int layA = 0;  
          
        float alpha = 0.8F; 
        float alphaR = 0F;  
        float alphaG = 0F;  
        float alphaB = 0F;
        
        for (int i = 0; i < width; i++)  
        {  
            for (int k = 0; k < height; k++)  
            {  
                pixColor = bmp.getPixel(i, k);  
                layColor = copyBitmap.getPixel(i, k);  
                // 获取原图片的RGBA值   
                pixR = Color.red(pixColor);  
                pixG = Color.green(pixColor);  
                pixB = Color.blue(pixColor);  
                pixA = Color.alpha(pixColor);  
                // 获取边框图片的RGBA值   
                layR = Color.red(layColor);  
                layG = Color.green(layColor);  
                layB = Color.blue(layColor);  
                layA = Color.alpha(layColor);  
                // 颜色与纯黑色相近的点   
                if (layR < 20 && layG < 20 && layB < 20)  
                {  
                    alpha = 1F;  
                }  
                else  
                {  
                    alpha = 0.3F;  
                }  
                alphaR = alpha;  
                alphaG = alpha;  
                alphaB = alpha;  
                // 两种颜色叠加   
                newR = (int) (pixR * alphaR + layR * (1 - alphaR));  
                newG = (int) (pixG * alphaG + layG * (1 - alphaG));  
                newB = (int) (pixB * alphaB + layB * (1 - alphaB));  
                layA = (int) (pixA * alpha + layA * (1 - alpha));  
                // 值在0~255之间   
                newR = Math.min(255, Math.max(0, newR));  
                newG = Math.min(255, Math.max(0, newG));  
                newB = Math.min(255, Math.max(0, newB));  
                newA = Math.min(255, Math.max(0, layA));  
                //绘制 
                newColor = Color.argb(newA, newR, newG, newB);  
                drawBitmap.setPixel(i, k, newColor);  
            }  
        }  
        return drawBitmap;
    }
       它的运行效果如下所示,其中前2附图是方法一,但是它的合成效果不是很优秀,而第三张图是第二种方法,但是它的响应时间稍微要长些.
                 
       在第一种方法通过PoterDuffXfermode类作为过渡模式,该类因Thomas Porter和Tom Duff而得名,他们于1984年在ACM SIGGRAPH计算机图形学发表“Compositing digital images(合成数字图像)”的文章,它介绍了彼此重叠绘制图像的不同规则.这些规则定义了哪些图像的哪些部分将出现在结果输出中.
        在Android的PorterDuff.Mode类中列举了Porter和Duff及其他更多人制定的规则.
        android.graphics.PorterDuff.Mode.SRC:此规则意味着只绘制源图像,当前它正是应用此规则的Paint对象.
        android.graphics.PorterDuff.Mode.DST:此规则意味着只显示目标图像,在已有画布上的初始图像.

        如下图所示,定义Mode值如下:
                                       
        其中,有4个规则定义了当一幅图像放置在另一幅图像上时如何合成这两幅图像,它是我们经常使用的值:
       
    android.graphics.PorterDuff.Mode.LIGHTEN:获得每个位置上两幅图像中最亮的像素并显示.
        an
    droid.graphics.PorterDuff.Mode.DARKEN:获得每个位置上两幅图像中最暗的像素并显示.
        an
    droid.graphics.PorterDuff.Mode.MULTIPLY:将每个位置的两个像素相乘,除以255,使用该值创建一个新的像素进行显示.结果颜色=顶部颜色*底部颜色/255.
        android.graphics.PorterDuff.Mode.SCREEN:反转每个颜色,执行相同操作.结果颜色=255-(((255-顶部颜色)*(255-底部颜色))/255)

    三. 圆形和圆角矩形显示图片

       最后讲述如何实现圆形和圆角矩形显示图片,在onCreate函数中添加如下代码:
    //圆角合成图片
    roundImageBn = (Button)findViewById(R.id.button5);
    roundImageBn.setOnClickListener(new OnClickListener() {
    	@Override
    	public void onClick(View v) {
    		imageShow.setImageBitmap(getRoundedCornerBitmap(bmp) );
    	}
    });
       然后通过自定义函数getRoundedCornerBitmap实现圆形:
    //生成圆角图片
    private Bitmap getRoundedCornerBitmap(Bitmap bitmap) 
    {
    	Bitmap roundBitmap = Bitmap.createBitmap(bitmap.getWidth(), 
             bitmap.getHeight(), Config.ARGB_8888); 
         Canvas canvas = new Canvas(roundBitmap); 
         int color = 0xff424242; 
         Paint paint = new Paint(); 
         //设置圆形半径
         int radius; 
         if(bitmap.getWidth()>bitmap.getHeight()) {
        	 radius = bitmap.getHeight()/2;
         }
         else {
        	 radius = bitmap.getWidth()/2;
         }
         //绘制圆形
         paint.setAntiAlias(true); 
         canvas.drawARGB(0, 0, 0, 0); 
         paint.setColor(color); 
         canvas.drawCircle( bitmap.getWidth()/ 2, bitmap.getHeight() / 2, radius, paint);
         paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); 
         canvas.drawBitmap(bitmap, 0, 0, paint);
         return roundBitmap; 
    }
       同样,如果把该函数里面内容替换即可实现圆形矩形显示图片:
    private Bitmap getRoundedCornerBitmap(Bitmap bitmap) 
    {
    	//绘制圆角矩形
    	Bitmap roundBitmap = Bitmap.createBitmap(bitmap.getWidth(), 
             bitmap.getHeight(), Config.ARGB_8888); 
         Canvas canvas = new Canvas(roundBitmap); 
         int color = 0xff424242; 
         Paint paint = new Paint(); 
         Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); 
         RectF rectF = new RectF(rect); 
         float roundPx = 80;      //转角设置80
         //绘制
         paint.setAntiAlias(true); 
         canvas.drawARGB(0, 0, 0, 0); 
         paint.setColor(color); 
         canvas.drawRoundRect(rectF, roundPx, roundPx, paint); 
         paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); 
         canvas.drawBitmap(bitmap, rect, rect, paint); 
    }
       运行结果如下图所示:
                                       
        总结:
        该文章主要讲述如何给图像增加相框,圆角显示图像和图像合成的介绍.里面主要通过源码并有详细的过程,为什么要写这篇文章?因为在图像处理中我认为这种添加边框、改变边框、图片合成都属于同一种类型的变化和渲染.该图像处理软件还没有整合,推荐大家看下面资料中两本书.
       
    最后希望文章对大家有所帮助,如果有不足或错误的地方请见谅!不论如何,我觉得这篇文章自己写得不错,自己先给自己一个赞吧!加油\(^o^)/~
        下载地址:http://download.csdn.net/detail/eastmount/8102845
        源码基本格式如下图所示:

    (By:Eastmount 2014-10-31 夜3点 http://blog.csdn.net/eastmount)
    参考资料与推荐博文:
    1.最该感谢的是两本书的作者《Android多媒体开发高级编程》和《Android图片处理总结 著:jacpy.may》,网上很多资料都是它们.
    2.android图像处理系列之六--给图片添加边框(下)-图片叠加 
    作者-SJF0115 他是转载了该书的一些文章,也非常不错.

    3.Android 图片合成:添加蒙板效果 不规则相框 透明度渐变效果的实现
    作者-HappyDelano 非常不错的文章,讲述了4张图实现桃心显示的效果.
    4.Android图片合成 作者-johnlxj 讲述了图片合成的实现过程.
    5.Android 完美实现图片圆角和圆形(对实现进行分析)
    作者-鸿洋_ 该作者很多android文章都非常不错
    6.android 画图之setXfermode 作者-lipeng88213 推荐起链接的Android图片倒影
    7.Android ImageView点击选中后添加边框 作者-黑米粥 该方法在切换图片中实用
    8.android 轻松实现在线即时聊天【图片、语音、表情、文字】 作者-anonymousblogs
    展开全文
  • 例如,网页制作过程中的图像比如横幅广告(banner)、商品图片、较大的插图等都可以保存为JPG格式。 4、GIF格式 GIF格式是一种通用的图像格式。它不仅是一种有损压缩格式,而且支持透明和动画。另外,GIF格式保存...

    一、 有关色彩的基本常识    
    我们知道,只要是彩色都可用亮度、色调和饱和度来描述,人眼中看到的任一彩色光都是这三个特征的综合效果。那么亮度、色调和饱和度分别指的是什么呢?        
    亮度:是光作用于人眼所引起的明亮程度的感觉,它与被观察物体的发光强度有关;        
    色调:是当人眼看到一种或多种波长的光时所产生的彩色感觉,它反映颜色的种类,是决定颜色的基本特性,如红色、棕色就是指色调;        
    饱和度:指的是颜色的纯度,即掺入白光的程度,或者说是指颜色的深浅程度,对于同一色调的彩色光,饱和度越深颜色越鲜明或说越纯。通常我们把色调和饱和度通称为色度。 现在你该明白了,亮度是用来表示某彩色光的明亮程度,而色度则表示颜色的类别与深浅程度。除此之外,自然界常见的各种颜色光,都可由红 (r) 、绿 (g) 、蓝 (b) 三种颜色光按不同比例相配而成;同样绝大多数颜色光也可以分解成红、绿、蓝三种色光,这就形成了色度学中最基本的原理 ---- 三原色原理 (rgb)

     
    二、 目前常见的图形(图像)格式    
    一般来说,目前的图形(图像)格式大致可以分为两大类:一类为位图;另一类称为描绘类、矢量类或面向对象的图形(图像)。
    前者是以点阵形式描述图形(图像)的,后者是以数学方法描述的一种由几何元素组成的图形(图像)。一般说来,后者对图像的表达细·致、真实,缩放后图形(图像)的分辨率不变,在专业级的图形(图像)处理中运用较多。 
    在介绍图形(图像)格式前,我们实在有必要先了解一下图形(图像)的一些相关技术指标 : 分辨率、色彩数、图形灰度。        
    分辨率:分为屏幕分辨率和输出分辨率两种,前者用每英寸行数表示,数值越大图形(图像)质量越好;后者衡量输出设备的精度,以每英寸的像素点数表示;        
    色彩数和图形灰度:用位( bit )表示,一般写成 2 的 n 次方, n 代表位数。
    当图形(图像)达到24 位时,可表现 1677 万种颜色,即真彩。灰度的表示法类似; 


    三、位图与矢量图
    1、位图
    位图也称点阵图,它是由许多点组成的,这些点称为像素。当许多不同颜色的点组合在一起后,便构成了一副完整的图像。 位图可以记录每一个点的数据信息,从而精确地制作色彩和色调变化丰富的图像。但是,由于位图图像与分辨率有关,它所包含的图像像素数目是一定的,若将图像放大到一定程度后,图像就会失真,边缘出现锯齿。
    2、矢量图
    矢量图也称向量式图形,它使用数学的矢量方式来记录图像内容,以线条和色块为主。矢量图像最大的优点是无论放大、缩小或旋转都不会失真,最大的缺点是难以表现色彩层次丰富且逼真的图像效果。 另外,矢量图占用的存储空间要比位图小很多,但它不能创建过于复杂的图形,也无法像位图那样表现丰富的颜色变化和细腻的色彩过渡。


    四、图像的色彩模式
    图像的色彩模式决定了显示和打印图像颜色的方式,常用的色彩模式有RGB模式、CMYK模式、灰度模式、位图模式、索引模式等。
    1、RGB模式
    RGB颜色被称为“真彩色”,是Photoshop中默认使用的颜色,也是最常用的一种颜色模式。RGB模式的图像由3个颜色通道组成,分别为红色通道(Red)、绿色通道(Green)和蓝色通道(Blue)。每个通道均使用8位颜色信息,每种颜色的取值范围是0~255,这三个通道组合可以产生1670万余种不同的颜色。
    在RGB模式中,用户可以使用Photoshop中所有的命令和滤镜,而且RGB模式的图像文件比CMYK模式的图像文件要小的多。不管是扫描输入的图像,还是绘制图像,一般都采用RGB模式存储。
    2、CMYK模式
    CMYK模式是一种印刷模式,由分色印刷的四种颜色组成。CMYK四个字母分别代表“青色(Cyan)”、“洋红色(Magenta)”、“黄色(Yellow)”和“黑色(Black)”,每种颜色的取值范围是0%~100%。CMYK模式本质上与RGB模式没有什么区别,只是产生色彩的原理不同。
    在CMYK模式中,C、M、Y这三种颜色混合可以产生黑色。但是,由于印刷时含有杂质,因此不能产生真正的黑色与灰色,只有与K(黑色)油墨混合才能产生真正的黑色与灰色。在Photoshop中处理图像时,一般不采用CMYK模式,因为这种模式的图像文件不仅占用的存储空间较大,而且不支持很多滤镜。
    所以,一般在需要印刷时才将图像转换成CMYK模式。
    3、灰度模式
    “灰度”模式可以表现出丰富的色调,但是也只能表现黑白图像。“灰度”模式图像中的像素是由8位的分辨率来记录的,能够表现出256种色调,从而使黑白图像表现的更完美。灰度模式的图像只有明暗值,没有色相和饱和度这两种颜色信息。其中,0%为黑色,100%为白色,K值是用来衡量黑色油墨用量的。使用黑白和灰度扫描仪产生的图像常以灰度模式显示。
    4、位图模式
    “位图”模式的图像又叫黑白图像,它用黑、白两种颜色值来表示图像中的像素。其中的每个像素都是用1 bit的位分辨率来记录色彩信息的,占用的存储空间较小,因此它要求的磁盘空间最少。位图模式只能制作出黑、白颜色对比强烈的图像。如果需要将一副彩色图像转换成黑白颜色的图像,必须先将其转换成“灰度”模式的图像,然后再转换成黑白模式的图像,即“位图”模式的图像。
    5、索引模式
    “索引”模式是网上和动画中常用的图像模式,当彩色图像转换为索引颜色的图像后会包含256种颜色。“索引”模式包含一个颜色表,如果原图像中的颜色不能用256色表现,则Photoshop会从可使用的颜色中选出最相近的颜色来模拟这些颜色,这样可以减少图像文件的尺寸。颜色表用来存放图像中的颜色并为这些颜色建立颜色索引,它可以在转换的过程中定义或在生成索引图像后修改。


    五、常用的图像格式
    1、PSD格式
    PSD格式是Photoshop工具的默认格式,也是唯一支持所有图像模式的文件格式。它可以保存图像中的图层、通道、辅助线和路径等信息。
    2、BMP格式
    BMP格式是DOS和Windows平台上常用的一种图像格式。BMP格式支持1~24位颜色深度,可用的颜色模式有RGB、索引颜色、灰度和位图等,但不能保存Alpha通道。BMP格式的特点是包含的图像信息比较丰富,几乎不对图像进行压缩,但其占用磁盘空间较大。
    3、JPEG格式
    JPEG格式是一种有损压缩的网页格式,不支持Alpha通道,也不支持透明。最大的特点是文件比较小,可以进行高倍率的压缩,因而在注重文件大小的领域应用广泛。例如,网页制作过程中的图像比如横幅广告(banner)、商品图片、较大的插图等都可以保存为JPG格式。
    4、GIF格式
    GIF格式是一种通用的图像格式。它不仅是一种有损压缩格式,而且支持透明和动画。另外,GIF格式保存的文件不会占用太多的磁盘空间,非常适合网络传输,是网页中常用的图像格式。
    5、PNG格式
    PNG格式是一种无损压缩的网页格式。它结合GIF和JPEG格式的优点,不仅无损压缩,体积更小,而且支持透明和Alpha通道。由于PNG格式不完全适用于所有浏览器,所以在网页中比GIF和JPEG格式使用的少。但随着网络的发展和因特网传输速度的改善,PNG格式将是未来网页中使用的一种标准图像格式。
    6、AI格式
    AI格式是Adobe Illustrator软件所特有的矢量图形存储格式。在Photoshop中可以将图像保存为AI格式,并且能够在Illustrator和CorelDraw等矢量图形软件中直接打开并进行修改和编辑。
    7、TIFF格式
    TIFF格式用于在不同的应用程序和不同的计算机平台之间交换文件。它是一种通用的位图文件格式,几乎所有的绘画、图像编辑和页面版式应用程序均支持该文件格式。
    TIFF格式能够保存通道、图层和路径信息,由此看来它与PSD格式并没有太大区别。但实际上,如果在其他程序中打开TIFF格式所保存的图像,其所有图层将被合并,只有用Photoshop打开保存了图层的TIFF文件,才可以对其中的图层进行编辑修改。

    展开全文
  • 文章首发于博客du_ok’s Notes,本文链接为知识图谱入门——知识表示与知识建模 本文首先介绍了早期的知识表示方法,接着介绍了知识图谱的基石——RDF及其扩展RDFS,在它们的基础上又介绍了表达能力以及推理能力更...
  • 肖仰华谈知识图谱:知识将比数据更重要,得知识者得天下   https://mp.weixin.qq.com/s?__biz=MzI0ODcxODk5OA==&amp;mid=2247498869&amp;idx=1&amp;sn=4e69bb2f27dd1289effe864551ca0bbe&amp;...
  • 分为两个部分,笔者看到的知识图谱在商业领域的应用,外加看到的一些算法框架与研究机构。 一、知识图谱商业应用 01 唯品金融大数据 使用的是OrientDB,Orientdb提供了大量的接口, 其中最常用的...
  • ,这个对象代表着一个存在于设备上的相机。 四、用程序操作图像 简单的图像处理方法是使用 UIKit 的  UIGraphicsBeginImageContext  方法。调用之后,你就可以在当前图形上下文中绘制一些内容...
  • 图片的24bit 和32bit的代表含义

    万次阅读 2017-12-20 13:54:00
    因此,对色彩的基础知识的良好掌控,在网页设计中才能做到游刃有余。  为了使下面的网页配色分析更易于理解,我们先来了解色彩的RGB模式和HSB模式。  RGB  RGB是表示红色绿色蓝色又称为三原色光,...
  • 知识图谱里的知识表示:RDF

    千次阅读 2019-07-05 22:00:41
    大部分知识图谱使用RDF描述世界上的各种资源,并以三元组的形式保存到知识库中。RDF( Resource Description Framework, 资源描述框架)是一种资源描述语言,它受到元数据标准、框架系统、面向对象语言等多方面的...
  • 奇怪的知识增加了

    万次阅读 多人点赞 2020-03-24 08:31:59
    突然旁边的IOS同事问:‘嘿,兄弟,我发现一个网站的图片很有意思啊,能不能帮我保存下来提升我的开发灵感?’ 作为一个坚强的社畜怎么能说自己不行呢,当时朕就不假思索的答应:‘oh, It’s simple. Wait for me ...
  • 知识图谱架构(Knowledge Graph)

    千次阅读 多人点赞 2020-04-07 16:10:57
    本文以通俗易懂的方式来讲解知识图谱相关的知识、尤其对从零开始搭建知识图谱过程当中需要经历的步骤以及每个阶段需要考虑的问题都给予了比较详细的解释。 知识图谱( Knowledge Graph)的概念由谷歌2012年正式...
  • JAVA GUI重要知识点学习心得

    千次阅读 2017-12-12 22:36:59
    本人最近学习javaGUI发现重要知识点和思想用的频率很高,把它们整理下来一起分享 1:JFrame窗口和JDialog窗口  一班JFrame用作主窗口,JDialog用作弹出窗口(即对话框),但JFrame也可以用作弹出窗口并设置一些功能...
  • 知识图谱入门 (二) 知识表示与知识建模

    万次阅读 多人点赞 2018-04-20 16:04:59
    本讲首先对早期的知识表示做了一个简单介绍,而后详细介绍了基于语义网的知识表示框架,如RDF和RDFS和查询语言...知识表示就是对知识的一种描述,或者说是对知识的一组约定,一种计算机可以接受的用于描述知...
  • 2 知识表示与知识建模

    千次阅读 2018-09-13 20:05:55
    早期知识表示简介: &amp;amp;amp;nbsp; 知识是智能的基础,提供推理能力。 相对正确性、不确定性、可表示性、可利用性。 &amp;amp;amp;nbsp; 常识性知识、领域性知识; 事实性知识、过程...
  • 知识表示

    千次阅读 2018-07-05 11:58:47
    http://pelhans.com/2018/03/16/xiaoxiangkg-note2/本讲首先对早期的知识...知识表示历史知识的概念早期的知识表示方法一阶谓词逻辑产生式系统框架表示法语义网络基于语义网的知识表示框架RDF简介RDF概念RDF和RDFSO...
  • 【转】知识图谱构建全过程

    万次阅读 多人点赞 2018-07-13 21:52:14
    知识图谱,是结构化的语义知识库,用于迅速描述物理世界中的概念及其相互关系,通过将数据粒度从document级别降到data级别,聚合大量知识,从而实现知识的快速响应和推理。 当下知识图谱已在工业领域得到了广泛应用...
  • 知识图谱初见

    千次阅读 2018-05-24 15:33:38
    一、概念知识图谱是一种数据结构,把世界上的知识组织成实体与实体之间的关系。1.1 关系规则(Schema)知识图谱首先要定义一个系统的关系规则,关系规则定义了不同类别实体之间可以处在的关系。如父子关系1.2 关系...
  • 数据层其实就是存储所有的三元组信息的知识库, 而模式层才是知识图谱的核心, 它是对数据层知识结构的一种提炼, 通常需要借助本体库来存储, 通过在模式层上建立一些约束和规则, 规范实体、 关系、 实体属性、 ...
  • Android Bitmap 知识点梳理

    千次阅读 2017-05-27 00:04:55
    在日常开发中,可以说和Bitmap每天都会...区别decodeResource()和decodeFile()这里的区别不是指方法名和参数的区别,而是对于解码后图片尺寸在处理上的区别:decodeFile()用于读取SD卡上的图,得到的是图片的原始尺寸
  • 知识库问答

    千次阅读 2018-08-10 14:28:40
    Extracted KBs指直接从网页中抽取出实体关系三元组的知识库。 Extracted KBs 知识库涉及到的两大关键技术是 实体链指(Entity linking) ,即将文档中的实体名字链接到知识库中特定的实体上。它主要涉及自然语言...
  • 1. 知识图谱发展历程 知识图谱的发展可以从人工智能和语义网(注意语义网和语义网络是不同的)这两个领域进行追溯。在人工智能方面,人类致力于使计算机更智能,能够进行推理、分析、预测等高级思维活动。而知识图谱是...
  • HTML所有知识点全面复习

    万次阅读 多人点赞 2020-05-22 07:53:48
    你可以通过本站的 CSS 教程 学习更多的 CSS 知识。 内联样式 ;"> ;">这是一个标题</h2> ;">这是一个段落。</p> </body> ;">一个标题</h1> ;color:red;font-size:20px;">一个段落。</p> 内部样式表 当单个文件需要...
  • 知识图谱学习笔记

    千次阅读 2019-06-27 23:06:05
    知识图谱入门 一. 通俗易懂解释知识图谱(Knowledge Graph) 1. 前言 从一开始的Google搜索,到现在的聊天机器人、大数据风控、证券投资、智能医疗、自适应教育、推荐系统,无一不跟知识图谱相关。它在技术领域的...
  • 发现一个好用的文档编写、知识沉淀的工具——语雀。 语雀—好用的文档编写、知识沉淀的工具 简单介绍 「语雀」是一个「专业的云端知识库」,孵化自 蚂蚁金服,是 体验科技]理念下的一款创新产品,已是 10 万阿里...
  • 我的知乎专栏,对知识图谱感兴趣的朋友可以关注。标题的命名顺序可能让有的读者不太习惯。通常在介绍一个陌生事物的应用前,我们先给出其定义。之所以换个顺序,是为了不让读者一开始就接触比较冰冷生硬的概念刻板...
  • InputContext有右键按下时,就在GameContext中生成一个代表移动者的GameEntity: // CreateMoverSystem.cs using System.Collections.Generic; using Entitas; using UnityEngine; // 监听的是InputContext中的...
  • 我觉得互联网技术天生具有开放和共享的基因,全球最大中文社区CSDN开设了知识图谱专栏,为互联网从业者和爱好者提供了一个知识共创平台。这些年以来,“生态”一词早已家喻户晓,在互联网领域,一些事物开始只是某个...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 111,973
精华内容 44,789
关键字:

代表知识的图片