精华内容
下载资源
问答
  • using System.IO;   protected void Button1_Click( object sender, EventArgs e) {   //如果存在文件   ...//删除图片   File .Delete(delFile); }

    using System.IO;

     

    protected void Button1_Click(object sender, EventArgs e)
    {
            //如果存在文件
            if (FileUpload1.HasFile)
            {

                //获得文件后缀
                string extension = Path .GetExtension(FileUpload1.PostedFile.FileName);
                switch (extension.ToLower())
                {
                    case ".gif" :
                    case ".jpg" :
                    case ".png" :
                    case ".bmp" :
                        //正确时执行


                        //获得图片所在文件夹的服务器路径
                        string path = Server.MapPath("~/photo/" );

                        string fileName = FileUpload1.FileName;

     

                        //上传图片 参数为 路径+文件名
                        FileUpload1.SaveAs(path + fileName);

     

                        //获得文件大小 单位K
                        int fileLength = Convert .ToInt32(FileUpload1.PostedFile.ContentLength) / 1024;


                        //获得图片对象
                        System.Drawing.Image myImage =
                              System.Drawing.Image .FromStream(FileUpload1.PostedFile.InputStream);

                        //获得图片宽和高
                        string widths = myImage.Width.ToString();
                        string heights = myImage.Height.ToString();

                        //通过获得的图片缩放 并保存
                        //这也是上传图片的另一种方法
                        System.Drawing.Image .GetThumbnailImageAbort callb = null ;
                        System.Drawing.Image newImage = myImage.GetThumbnailImage(100, 100, callb, new IntPtr ());
                        //保存图片到正确路径 文件名为 缩略图.png
                        newImage.Save(path + "缩略图.png" );
                        //释放image所使用的资源
                        newImage.Dispose();
                        myImage.Dispose();
                       
                        break ;


                    default :
                        //错误时执行
                        break ;
                }
            }
    }

     

    protected void Button2_Click(object sender, EventArgs e)
    {
            //获得图片的服务器路径
            string delFile = Server.MapPath("~/photo/img1.JPG" );

            //删除图片
            File .Delete(delFile);
    }

    展开全文
  • 虽然现在分享当道,但分享图片与其他信息时要慎重,一张照片信息可不是那么简单的哦。它可能包含多种数据信息,所以在PO到网上分享之前,最好先在系统中做一下简单的数据删除步骤,防止被他人偷窥或利用。如何避免...

        虽然现在分享当道,但分享图片与其他信息时要慎重,一张照片的信息可不是那么简单的哦。它可能包含多种数据信息,所以在PO到网上分享之前,最好先在系统中做一下简单的数据删除步骤,防止被他人偷窥或利用。如何避免这种情况呢?在Windows 7系统下,仅需三步即可删除数码照片上的个人数据。

      先把想要删除数据的照片放在一个文件夹里,这个步骤非必要,但在处理上更省时省力。

    第一步:选中所有照片文件

    Win7系统下如何删除数码照片上的个人信息

      选中图片属性 支持批量删除数据操作。

      选中所有,单击右键并选择“属性”。

    第二步:图片属性处理

    Win7系统下如何删除数码照片上的个人信息

      图片详细信息中可选保留信息。

      点击“详细”选项,然后点击“删除属性与个人信息”按键。

    第三步:删除属性

    Win7系统下如何删除数码照片上的个人信息

      自定义数据信息。

      如果想删除所有信息,点击确定即可(系统会为你生成一套备份)。

      如果想自定义选择个人数据的去留,选择“从这个文件中删除下列属性”,将鼠标下拉并选择需要删掉的个人数据,再点击确定。这个步骤不会生成备份,所以在删除前要想清楚呦。

      这个方法同样适用于其他文件的操作(Windows XP系统需要借助第三方软件帮助删除)。在分享照片与文件之前,可以先用这个方法删除个人数据,让分享更安全。

    展开全文
  • 当Mysql记录被删除,页中记录存储结构如何变化?当删除的记录再次被插入,页中记录存储结构如何变化?本篇讲解记录头信息的底层原理和计算,让你从原理理解它!

    说在前面——本篇也是我读书总结笔记,因为是讲底层原理,我个人认为本文难度是相当高的,可能需要一定的基础。

    我将文中的图片包含的计算原理全都演算了一遍,因为书本没有过程详细计算,欢迎大家阅读和仔细推敲。

    如果是大忙人,也可以跳过计算,看懂过程和大致原理即可。

    1.记录头信息有什么用?

      记录头信息里面有很多属性,最容易理解的就是next_record指针,单链表都会有next指针,这样才会找得到下一个结点,这对于页中的每条记录也是一样,上一条记录需要知道下一条记录在哪里。

      上一篇说到了innodb行格式,重点讲了一下dynamic行格式,知道一条记录实际存储如下图。没办法,说到底层原理如果不看上一篇文章是不可能完全理解的,耶稣来了也没法一篇说明白,见这里MySQL的varchar水真的太深了——InnoDB记录存储结构,必须记住下图的上面行格式部分,每条记录不仅是记录的真实数据,还有记录的额外信息。

    如果你目前只是为了开发学习本部分知识,那么可以直接跳到本篇第4、5节。传送–>

      在utf8mb4字符集中,能用0~4字节表示一个字符,像varchar这种变长类型和char这种定长类型实际占用的字节数都会被记录到变长字段列表

      如果字段没有被NOT NULL限定,那么就允许为NULL,该列就会有NULL值列表

      关于记录头信息,下面这个表先列出来,往后面看的时候不理解时可以返回查看这个表,方便理解。

    名称 大小(单位:bit) 描述
    预留位1 1 没有使用
    预留位2 1 没有使用
    delete_mask 1 标记该记录是否被删除
    min_rec_mask 1 B+树的每层非叶子节点中的最小记录都会添加该标记
    n_owned 4 表示当前记录拥有的记录数
    heap_no 13 表示当前记录在记录堆的位置信息
    record_type 3 表示当前记录的类型,0表示普通记录,1表示B+树非叶节点记录,2表示Infimum记录,3表示Supremum记录
    next_record 16 表示本条记录真实数据部分到下一条记录真实数据的距离

    从表中所说可以看到,记录头信息一共是40bit就是5个字节

    2.记录在页中的存储结构

      innodb管理存储空间的基本单位,一个页的大小默认是16KB,插入的记录会按照指定的行格式(默认dynamic)存储到User Records部分。但是在一开始生成页的时候,其实并没有User Records这个部分,每当我们插入一条记录,都会从Free Space部分(也就是尚未使用的存储空间) 申请一个记录大小的空间,并将这个部分划分到User Records部分,当Free Space部分的空间全部被User Records部分替代掉之后,也就意味着这个页使用完了,如果还有新的记录插入的话,就需要去申请新的页了。

    有人会疑问了,图中这个Infimum+Supremum是什么?

       Infimum记录 的下一条记录就是本页中主键值最小的用户记录,而本页中主键值最大的用户记录的下一条记录就是 Supremum记录。但是这两条记录不在User Records部分,是单独占用的空间,可结合上一张图理解。都是由5个字节的记录头和8个字节的一个固定单词组成,如下所示

    3.记录头信息的底层原理和计算(show time,难度搞起来)

    首先,建个表record_test

    CREATE TABLE record_test(
     c1 INT,
     c2 INT,
     c3 VARCHAR(10000),
      PRIMARY KEY (c1)
    ) CHARSET=utf8mb4;
    

    执行插入语句

    INSERT INTO record_test VALUES(1, 100, 'aa你好'), (2, 200, 'bb哈哈'), (3, 300, 'cc来了'), (4, 400, 'dd在哪');
    

    最终表数据如下

    4条记录的存储结构示意图如下

    注意:
    1.图中画记录的时候只选取了记录头的一部分,省略了变长列表和NULL值列表,但是实际计算的时候要带上。
    2.这里把隐藏列省略了,归并到 “其他信息” 里面了

      看到这里,你一定和我有着相同的疑问,为什么next_record显示36,它表示本条记录真实数据部分到下一条记录真实数据的距离。这个怎么计算的呢?

      现在我来和你说说底层那些不为人知的东西。要知道,记录的真实数据除了所有的数据列之外,MySQL还会为每条记录默认添加一些列(也称为隐藏列),隐藏列也包含在记录的真实数据部分,如下

    列名 是否必须 占用空间 描述
    DB_ROW_ID 6字节 行ID,唯一标识一条记录
    DB_TRX_ID 6字节 事务ID
    DB_ROLL_PTR 7字节 回滚指针

      InnoDB表对主键的生成策略:优先使用用户自定义主键作为主键,如果用户没有定义主键,则选取一个Unique键作为主键(必须NOT NULL不允许存NULL),如果表中连Unique键都没有定义的话,则InnoDB会为表默认添加一个名为DB_ROW_ID的隐藏列作为主键。

      从上表中可以看出:InnoDB存储引擎会为每条记录都添加 DB_TRX_IDDB_ROLL_PTR这两个列,但是 DB_ROW_ID是可选的(在没有自定义主键以及不允许存NULL值的Unique键的情况下才会添加该列)。这些隐藏列的值不用我们操心,InnoDB存储引擎会自己帮我们生成的。

    所以刚刚next_record36字节的计算方法就是
    6+7(隐藏列2个,因为有自定义主键)=13字节
    4(int长度)+4(int长度)+8(变长varchar实际字节数)=16字节
    下一列记录的额外信息(变长列表+NULL值列表+记录头)
    1+1+5=7字节
    总共13+16+7=36

    注意,图中画记录的时候只选取了记录头的一部分,计算的时候直接记录头按5字节计算,加上变长列表长度和NULL值列表长度即可。

    如果变长列表NULL值列表不知道怎么计算长度,见上一篇MySQL的varchar水真的太深了——InnoDB记录存储结构,不看上篇不可能理解的。

    而且你可能会疑问为什么第4条记录的下一条却要-123字节?

      前面说过,最大记录的下一条记录是Supremum记录,而Infimum记录的heap_no0,而Supremum记录的heap_no1,存放位置是在所有记录之前,最小记录的heap_no是从2开始的。前面给大家看过记录在页中的存储结构,知道InfimumSupremum记录在User Records之前。

      所以最大记录的下一条就是要找到Supremum记录,那么就要往回走3条记录和第一条记录的最小记录变长列表+NULL值列表+头信息(共7字节),然后加上Supremum真实数据部分的固定8个字节。

    36*3+7+8=123字节

      所以为第4条记录的next_record-123,代表指针往前走123字节就是下一条记录的真实数据部分的地址。


    如果你还细致的观察到Infimum记录的next_record28,我觉得你挺适合做研究。

      在存储结构上,Infimum记录后面是Supremum记录,接着才是第一条数据记录。
      逻辑上,Infimum下一条记录是第一条数据记录,所以计算方法是
    8(Infimum固定字节) + 5(Supremum记录头) + 8(Supremum固定字节) + 7(第一条数据记录的变长字段列表+NULL值列表+记录头) = 28字节。

      为了更形象的表现next_record的作用,我们用箭头来替代next_record的值,注意箭头指向的位置,都是指向真实数据开始的地址。

    你可能会疑问,为啥要next_record指向记录头信息和真实数据之间的位置呢?指向整条记录的开头位置不好吗?

      因为这个位置刚刚好,向左读取就是记录头信息,向右读取就是真实数据。我们前边还说过变长字段长度列表、NULL值列表中的信息都是逆序存放,这样可以使记录中位置靠前的字段和它们对应的字段长度信息在内存中的距离更近,可能会提高高速缓存的命中率。

    4.当记录被删除,页中记录存储结构如何变化?

    当然最大的疑问就是被删除的记录还在页中么?
      是的,你以为记录删除了,可它还在真实的磁盘上(占用空间依然存在)。这些被删除的记录之所以不从磁盘上移除,是因为移除它们之后,还需要再磁盘中重新排序其他记录,这会带来一定的性能损耗,所以只是打一个删除标记就可以避免这个问题,首先deleted_mask设置为1,然后被删除掉的记录加入到垃圾链表,记录在这个链表中占用的空间称为可重用空间,之后如果有新记录插入到表中的话,它们就可能覆盖掉被删除的这些记录占用的空间。

    来演示一下

    delete from record_test where c1 = 2;
    

    发现第二条记录被删了

    在内存中是怎么样的呢?

    删除第2条记录变化如下

    • 2条记录并没有从存储空间中移除,而是把该条记录的delete_mask值设置为1
    • 2条记录的next_record值变为了0,意味着该记录没有下一条记录了。
    • 1条记录的next_record指向了第3条记录。
    • 最大记录的n_owned值从5变成了4,因为除了自身Supremum记录外,还有3条数据记录(注:Infimumn_owned1是因为包含自身算一条记录)

      无论怎么对页中的数据进行增删改操作,InnoDB始终会维护记录的一个单向链表,链表中的各个节点是按照主键值从小到大的顺序链接起来的。

    5.当删除的记录再次被插入,页中记录存储结构如何变化?

    INSERT INTO record_test VALUES(2, 200, 'bb哈哈');
    

    可以看到,刚刚删除的第二条数据又回来了

    内存结构变化如下

      InnoDB并没有因为新记录的插入而为它申请新的存储空间,而是直接复用了原来被删除记录的存储空间。

      当数据页中存在多条被删除掉的记录时,这些记录的next_record属性将会把这些被删除掉的记录组成一个垃圾链表,以备之后重用这部分存储空间。


    本篇总结:
      本篇主要讲了Infimum+Supremum部分,分别是页中最小记录的前一个和最大记录的后一个记录,User Records部分使我们插入的真实数据部分,Free Space是页总尚未使用的部分。然后讲解了图中next_record指针地址的计算。
      我们知道,页中的记录是单链表,页与页之间是双向链表,其实每个数据页的File Header部分有上一页和下一页的编号,所以所有数据页会组成一个双向链表。


    欢迎一键三连~

    有问题请留言,大家一起探讨学习

    ----------------------Talk is cheap, show me the code-----------------------
    展开全文
  • 我现在用C#做了一个界面,其中checkedlistbox中用于存储学生名,旁边6个编辑框用于显示勾选学生的信息(其中一个是学生名),现在我想勾选一个学生名进行修改和删除该学生在txt中的数据,如何操作 有没有详细代码!...
  • 关键时刻,第一时间送达!... 目前Samsung的Galaxy Tab和Nexus S均有前置摄像头,获取Android摄像头的详细信息,在Android 2.3SDK中得到了增强:  在android.hardware.Camera类中,API Level 9的SDK中

    点击上方“程序员大咖”,选择“置顶公众号”

    关键时刻,第一时间送达!

    640?wxfrom=5&wx_lazy=1

    0.gif?wxfrom=5&wx_lazy=1


    如何获取Android设备上的详细的摄像头信息呢? 目前Samsung的Galaxy Tab和Nexus S均有前置摄像头,获取Android摄像头的详细信息,在Android 2.3SDK中得到了增强:

      在android.hardware.Camera类中,API Level 9的SDK中加入了两个比较重要的方法,使用getNumberOfCameras这个static类型方法可以获取当前Android设备上的摄像头数量,比如Nexus S有两个,方法原型如下

      public static int getNumberOfCameras ()   

      而对于具体的每个摄像头的信息,可以通过Camera类的getCameraInfo()这个静态方法获取,该方法有两个参数,参数一的ID,我们通过getNumberOfCameras获取的值减1即可,类似数组索引从0开始一样,用循环遍历每个摄像头信息,参数二是android.hardware.Camera.CameraInfo类,有关getCameraInfo方法的原型如下:

      public static void getCameraInfo (int cameraId, Camera.CameraInfo cameraInfo)

      对于Camera.CameraInfo类而言,比较简单,包含两个字段

      public int facing   代表摄像头的方位,目前有定义值两个分别为CAMERA_FACING_FRONT前置和CAMERA_FACING_BACK后置
      public int orientation  下面是拍照的旋转方向,一般自然些有0度、90度、180度和270度,这样可以获取我们正确的手握设备是横着还是竖着,有关拍照时的方向设置,可以参考下面的代码设置

      public static void setCameraDisplayOrientation(Activity activity,
             int cameraId, android.hardware.Camera camera) {
         android.hardware.Camera.CameraInfo info =
                 new android.hardware.Camera.CameraInfo();
         android.hardware.Camera.getCameraInfo(cameraId, info);
         int rotation = activity.getWindowManager().getDefaultDisplay()
                 .getRotation();
         int degrees = 0;
         switch (rotation) {
             case Surface.ROTATION_0: degrees = 0; break;
             case Surface.ROTATION_90: degrees = 90; break;
             case Surface.ROTATION_180: degrees = 180; break;
             case Surface.ROTATION_270: degrees = 270; break;
         }

         int result;
         if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
             result = (info.orientation + degrees) % 360;
             result = (360 - result) % 360;  // compensate the mirror
         } else {  // back-facing
             result = (info.orientation - degrees + 360) % 360;
         }
         camera.setDisplayOrientation(result);
     }



    使用摄像头拍照
     
    1. 使用 SurfaceView 控件来显示摄像头捕捉到的画面
           <SurfaceView android:layout_width="fill_parent" android:layout_height="240dip" android:id="@+id/surfaceView" />
     
    2. 具体细节
           /* 获取 SurfaceView 控件 */
           SurfaceView surfaceView = (SurfaceView)this.findViewById(R.id.surfaceView);
           /* 设置分辨率 */
           surfaceView.getHolder().setFixedSize(176, 144);
           /*下面设置Surface不维护自己的缓冲区,而是等待屏幕的渲染引擎将内容推送到用户面前*/
           surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
           /* 打开摄像头,注意这里是 android.hardware.Camera */
           Camera camera = Camera.open();
          
           /* 为 Camera 设置摄像参数 */
           Camera.Parameters parameters = camera.getParameters();
          
           /* 设置预览照片的大小,此处设置为全屏 */
           WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE); // 获取当前屏幕管理器对象
           Display display = wm.getDefaultDisplay();                                      // 获取屏幕信息的描述类
           parameters.setPreviewSize(display.getWidth(), display.getHeight());          // 设置
          
           /* 每秒从摄像头捕获5帧画面, */
           parameters.setPreviewFrameRate(5);
           /* 设置照片的输出格式:jpg */
           parameters.setPictureFormat(PixelFormat.JPEG);
           /* 照片质量 */
           parameters.set("jpeg-quality", 85);
           /* 设置照片的大小:此处照片大小等于屏幕大小 */
           parameters.setPictureSize(display.getWidth(), display.getHeight());
           /* 将参数对象赋予到 camera 对象上 */
           camera.setParameters(parameters);
          
           /* 设置用 SurfaceView 作为承载镜头取景画面的显示 */
           camera.setPreviewDisplay(surfaceView.getHolder());
           /* 开始预览 */
           camera.startPreview();
           /* 自动对焦 */
           camera.autoFocus(null);
           /* 拍照片 */
           camera.takePicture(null, null, null, jpegCallback);
           /* 停止预览 */
           camera.stopPreview();
           /* 释放摄像头 */
           camera.release();
     
    3. 添加使用摄像头的权限
           <uses-permission android:name="android.permission.CAMERA"/>
     
    4. 测试: 目前模拟器不支持拍照环境的模拟,必须使用真实手机测试。
     
    5. 代码清单
           ** string values : strings.xml
                 view plaincopy to clipboardprint?
    <?xml version="1.0" encoding="utf-8"?>  
    <resources>  
        <string name="app_name">手机拍照程序</string>  
    </resources>  
    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <string name="app_name">手机拍照程序</string>
    </resources>
          
           ** AndroidManifest.xml
                 view plaincopy to clipboardprint?
    <?xml version="1.0" encoding="utf-8"?>  
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
          package="wjh.android.takepicture"  
          android:versionCode="1"  
          android:versionName="1.0">  
        <application android:icon="@drawable/icon" android:label="@string/app_name">  
            <!-- android:screenOrientation="landscape" 表示横向界面 -->  
            <activity android:name=".MainActicity" android:label="@string/app_name"  android:screenOrientation="landscape">  
                <intent-filter>  
                    <action android:name="android.intent.action.MAIN" />  
                    <category android:name="android.intent.category.LAUNCHER" />  
                </intent-filter>  
            </activity>  
        </application>  
        <uses-sdk android:minSdkVersion="8" />  
        <!-- 在SDCard中创建与删除文件权限 -->  
        <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>  
        <!-- 往SDCard写入数据权限 -->  
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>  
        <!-- 申请使用摄像头的权限 -->  
        <uses-permission android:name="android.permission.CAMERA"/>  
    </manifest>  
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="wjh.android.takepicture"
          android:versionCode="1"
          android:versionName="1.0">
        <application android:icon="@drawable/icon" android:label="@string/app_name">
         <!-- android:screenOrientation="landscape" 表示横向界面 -->
            <activity android:name=".MainActicity" android:label="@string/app_name"  android:screenOrientation="landscape">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
        <uses-sdk android:minSdkVersion="8" />
        <!-- 在SDCard中创建与删除文件权限 -->
     <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
     <!-- 往SDCard写入数据权限 -->
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
        <!-- 申请使用摄像头的权限 -->
     <uses-permission android:name="android.permission.CAMERA"/>
    </manifest>
     
          
           ** main.xml
                 view plaincopy to clipboardprint?
    <?xml version="1.0" encoding="utf-8"?>  
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
        android:orientation="vertical"  
        android:layout_width="fill_parent"  
        android:layout_height="fill_parent"  
        >  
    <SurfaceView android:id="@+id/surfaceView"  
        android:layout_width="fill_parent"    
        android:layout_height="fill_parent"    
        />  
           
    </LinearLayout>  
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        >
    <SurfaceView android:id="@+id/surfaceView"
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent" 
        />
        
    </LinearLayout>
     
          
           ** MainActicity
                  view plaincopy to clipboardprint?
    public class MainActicity extends Activity {   
        private Camera camera;    
        private boolean preview  = false ;   
        @Override  
        public void onCreate(Bundle savedInstanceState) {   
            super.onCreate(savedInstanceState);   
               
            /*  
             *设置窗口属性:一定要在 setContentView(R.layout.main) 之前  
             */  
            // 窗口标题   
            requestWindowFeature(Window.FEATURE_NO_TITLE);   
            // 全屏    
            getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);   
               
            setContentView(R.layout.main);   
               
           SurfaceView surfaceView =  (SurfaceView) findViewById(R.id.surfaceView);   
           surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);   
           surfaceView.getHolder().setFixedSize(176, 164);   
              
           surfaceView.getHolder().addCallback(new SurfaceViewCallback());   
        }   
           
        private final class SurfaceViewCallback implements Callback {   
            /**  
             * surfaceView 被创建成功后调用此方法  
             */  
            @Override  
            public void surfaceCreated(SurfaceHolder holder) {   
                /*   
                 * 在SurfaceView创建好之后 打开摄像头  
                 * 注意是 android.hardware.Camera  
                 */  
                camera = Camera.open();   
                Camera.Parameters parameters = camera.getParameters();   
                /* 设置预览照片的大小,此处设置为全屏 */  
                WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE); // 获取当前屏幕管理器对象   
                Display display = wm.getDefaultDisplay();                        // 获取屏幕信息的描述类   
                parameters.setPreviewSize(display.getWidth(), display.getHeight());          // 设置   
                   
                /* 每秒从摄像头捕获5帧画面, */  
                parameters.setPreviewFrameRate(5);   
                /* 设置照片的输出格式:jpg */  
                parameters.setPictureFormat(PixelFormat.JPEG);   
                /* 照片质量 */  
                parameters.set("jpeg-quality", 85);   
                /* 设置照片的大小:此处照片大小等于屏幕大小 */  
                parameters.setPictureSize(display.getWidth(), display.getHeight());   
                /* 将参数对象赋予到 camera 对象上 */  
                camera.setParameters(parameters);   
                preview = true;   
            }   
            @Override  
            public void surfaceChanged(SurfaceHolder holder, int format, int width,   
                    int height) {   
            }   
            /**  
             * SurfaceView 被销毁时释放掉 摄像头  
             */  
            @Override  
            public void surfaceDestroyed(SurfaceHolder holder) {   
                if(camera != null) {   
                    /* 若摄像头正在工作,先停止它 */  
                    if(preview) {   
                        camera.stopPreview();   
                        preview = false;   
                    }          
                    camera.release();   
                }   
            }   
               
        }   
           
           
        /**  
         * 手机键盘按键事件  
         * 返回 true, 将阻止事件继续传递,例如搜索键,他默认会触发和打开系统的搜索引擎。返回true后,将不会触发。  
         */  
        @Override  
        public boolean onKeyDown(int keyCode, KeyEvent event) {   
            /*  
             * event.getRepeatCount() 为重复按键的次数,例如,快速地对某个键连续按了两次,则此值为一,表示重复了一次。往上可以累推。  
             * 按键只被按了一次,则此值为 0。  
             * 这有点类似于鼠标的 "单击" 和 "双击"。  
             */  
            if(camera != null && event.getRepeatCount() == 0 ) {   
                switch (keyCode) {   
                case KeyEvent.KEYCODE_SEARCH: // 搜索键   
                    /* 按下搜索键自动对焦 , 如果要关注它的事件,  
                     * 可以实现 AutoFocusCallback 接口,并实例化其对象传入 */  
                    camera.autoFocus(null);   
                    break;   
                case KeyEvent.KEYCODE_CAMERA: // 拍照键   
                case KeyEvent.KEYCODE_DPAD_CENTER: // 中间确认键   
                    /*  
                     * @param shutter : 照片被捕获之后的回调对象  
                     * @param raw : 此回调对象可以生产为压缩的图片数据  
                     * @param jpeg : 此回调对象可以产生压缩后的图片数据,其onPictureTaken将被调用  
                     */  
                    camera.takePicture(null, null, new TakePictureCallback());   
                       
                    /* 拍完照后回到预览状态,继续取景 -- 错误的方式 */  
                    // camera.startPreview();必须写在 onPictureTaken 方法内部,因为 takePicture 内部是另开了一条线程异步的完成保存照片等操作。   
                    // 虽然 takePicture 方法完成了,但是并不代表其内部的工作全部完成,也不代表摄像头以及从上一次“拍照”任务中工作完毕   
                    break;   
                default:   
                    break;   
                }   
                return true;   
            }   
               
            return super.onKeyDown(keyCode, event);   
        }   
           
        /**  
         * 处理照片被拍摄之后的事件  
         */  
        private final class TakePictureCallback implements PictureCallback {   
            @Override  
            public void onPictureTaken(byte[] data, Camera camera) {   
                Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);   
                   
                /* 照片将被保存到  SD 卡跟目录下,文件名为系统时间,后缀名为".jpg" */  
                File file = new File(Environment.getExternalStorageState(), System.currentTimeMillis() + ".jpg");   
                try {   
                    FileOutputStream fos = new FileOutputStream(file);   
                       
                    /* 位图格式为JPEG  
                     * 参数二位 0-100 的数值,100为最大值,表示无损压缩   
                     * 参数三传入一个输出流对象,将图片数据输出到流中   
                     */  
                    bitmap.compress(CompressFormat.JPEG, 100, fos);   
                    fos.close();   
                       
                    /* 拍完照后回到预览状态,继续取景 */  
                    camera.startPreview();   
                } catch (IOException e) {   
                    e.printStackTrace();   
                }   
            }   
        }   
    }

    640.jpeg

    • 来自:开源中国

    • https://my.oschina.net/u/874134/blog/187992

    • 程序员大咖整理发布,转载请联系作者获得授权

    640.jpeg

    0?【点击成为安卓大神】


    展开全文
  • Python 技术篇-获取图片GPS信息,锁定追踪图片拍摄地点、拍摄时间。 我们需要 exifread 库,这个就是用来提取 GPS 信息的。直接 pip install exifread 来安装就好了。 我用前段时间朋友在三亚拍的这个骆驼照片来做个...
  • Git使用详细教程

    万次阅读 多人点赞 2016-03-23 23:20:53
    合并完成后,我们可以接着删除dev分支了,操作如下: 总结创建与合并分支命令如下: 查看分支:git branch 创建分支:git branch name 切换分支:git checkout name 创建+切换分支:git checkout –b name 合并某...
  • Java学习路线(完整详细版)超详细

    万次阅读 多人点赞 2019-05-14 10:56:47
    图片标签 4. 超链接标签 5. 表格标签 6. 无序列表标签 7. 有序列表标签 8. 定义列表标签 9. div标签 10. 语义化标签 11. 表单标签 3 第二部分:CSS3 1. CSS3简介和用途 2. CSS3书写规范 3. CSS3基本语法 4. CSS3三...
  • ASP .net(照片列表详细功能演示)

    千次阅读 2013-02-14 11:06:57
    ASP .net(照片列表详细功能演示) 点击RSS订阅 大家好,今天我们需要讲解的内容就是把上篇文章当中提到的照片列表的很多功能细化去做。 那么之间我们两篇文章的目的就是要让大家深刻体会get,post的使用场景极其...
  • 需求:要求使用Struts2框架实现页面中注册,登陆,更新,删除,要求提供用户设置头像模块,浏览信息时提供头像预览,自由美化页面 实施: 设计数据库:设置用户基本信息,基本账号,密码,以及注册时间,登陆次数,...
  • SD卡照片删除怎么恢复?教程全解

    千次阅读 2019-05-07 10:05:26
    SD卡照片删除怎么恢复?对于数据存储设备来说,因一些意外因素导致数据出现误删的情况常有,那各位是怎么应对这种情况的呢?如果之前有在其他地方进行过数据的备份操作,那么此时可以进行还原的操作,那么对于未备份...
  • 我们都知道 upload 是上传文件的组件,但同时可以对上传文件进行预览,这里我才用 upload 预览图片。 首先介绍的是list-type:文件列表的类型,可选值:text | picture | picture-card ,默认值为 text. file-list...
  • 最近在调试 前后端分离的请求测试,遇到了一个406错误, 无法接受,于是开始了人肉搜索406最后 还是HTTP头部信息里的Accept:application/json 这个Accept 导致的, 后端设置了只允许application/json 这种形式,so...
  • Linux删除大量图片(小文件)

    千次阅读 2018-10-11 14:50:43
    今天连接公司测试服务器,发现磁盘满了,经过一番查找,找到了在home/file/images 下面大量无用图片,于是想要删除这些图片,使用命令 rm -rf * 无任何反应,决定换个命令,来解决这个问题,找了一些方法最终采用...
  • 想要悄悄的获取某人的位置,只需...获取拍摄照片的经纬度,时间,设备信息。这里使用的照片需是拍摄的原图,图片路径本文是放在了与运行程序相同的文件夹。实现代码如下: import exifread # 获取照片位置 cl...
  • 图片服务 - thumbor详细介绍

    千次阅读 2019-09-03 08:51:07
    图片服务 - thumbor详细介绍 什么是thumbor? Thumbor是一种智能成像服务。它支持按需裁剪,调整大小和翻转图像。 它具有非常智能的图像重要点检测功能,可以使用最先进的人脸和特征检测算法(更多关于检测...
  • 进入后,把里面的内容删除,添加新的内容 <html> <head> <title>--压缩测试页--</title> </head> <body> <h1>这是压缩页的内容</h1> <img src=...
  • 详细阐述Web开发中的图片上传问题

    千次阅读 2015-01-15 19:55:20
    Web开发中,图片上传是一种极其常见的功能。但是呢,每次做上传,都花费了不少时间。 一个“小功能”花费我这么多时间,真心不愉快。 So,要得认真分析下原因。1.在最初学习Java Web开发的时候,经验不足,属于...
  • 安装 sudo apt-get install libimage-exiftool-perl 使用 exiftool 文件路径 删除这些信息 exiftool -all= 文件路径
  • 之前的两篇文章介绍了图片系统的技术组件选型和技术方案设计,从这篇文章开始我们将搭建工程进行详细的编码开发和效果测试。整个图片服务工程代码会上传到了CSDN的下载区,如果对工程感兴趣那么读者可以直接下载。
  • 超强、超详细Redis入门教程

    万次阅读 多人点赞 2017-03-04 16:20:02
    这篇文章主要介绍了超强、超详细Redis入门教程,本文详细介绍了Redis数据库各个方面的知识,需要的朋友可以参考下 【本教程目录】 1.redis是什么 2.redis的作者何许人也 3.谁在使用redis 4.学会安装redis 5.学会...
  • uploadify多图片上传详细使用说明

    千次阅读 2013-04-09 15:15:40
    1.在过去一年,小编写过一个批量上传图片的例子,那个例子是基于百度编辑器改造的,用起来必须依赖百度编辑器,所以小编就又弄了一个,就是今天要介绍的了,uploadify上传的了前端用flash,javascript编写,后端兼容...
  • EXIF信息 可交换图像文件格式(英语:Exchangeable image file format,官方简称Exif),是专门为数码相机的照片设定...这个信息是相当详细了。只要是拍摄的照片都有这个信息,所以这个信息也是有泄露个人隐私的风险...
  •  在H5多图上传的场合,file框的filelist属性是不可编辑的,所以,无法通过修正filelist属性来达到将上传的多图中某一张图片删除。那么就可以使用另一种方式来达到目的即:base64编码格式。 背景知识:  Base64是...
  • 之前有几个朋友都问过我相关的问题,当然,他们只是觉得我的PS学的还可以,所以觉得,兴许我是有办法可以将修改过的照片上的信息全部清除的,是可以让照片回到最初的原始状态的!但是很抱歉,就算是PS的功能有多么的...
  • 环境 操作系统:win7 虚拟机:centos7 前言 预备知识 ...按照文件大小降序 ...du * -sh | sort -hr #h 表示以人可读...根据文件的创建时间(修改时间)排序升序,取前100条,并且指定匹配名称为数字的,并删除 ...
  • 注意坑:按理说我们点击删除一个图片就剩下一个,然后上传一个又变成两个了,结果不是你们想的那样,删除一个,上传一个,结果是三个,删除的没有真正的删除,你们可以去Avue官网去看看这个坑 看坑链接 1.删除 2....
  • apk 包,可以通过 aapt 工具详细查看包内的各项信息(包名、APP名称、APP图标、APP版本信息、SDK版本信息、权限列表等),还可对包内已编译的 xml 进行反编译输出,还可以对 apk 包进行修改(添加或删除文件,...
  • 给对话框添加背景图片方法很多,在此贴出两种很常见的方法。一种是
  • 之前我写过一篇关于《DWZ(JUI)整合Kindeditor应用于dialog弹出框》,只是讨论了前端的应用,并没有详细介绍后台代码实现。本文除了介绍后台的代码实现,还顺便介绍一些KindEditor的前端应用技巧。以前的是SSH框架...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 122,044
精华内容 48,817
关键字:

如何删除图片详细信息