zoukankan      html  css  js  c++  java
  • Bitmap

    加载大图片到内存

    public class MainActivity extends Activity {

     private ImageView iv_img;

     private int windowHeight;

     private int windowWidth;

     @Override

     protected void onCreate(Bundle savedInstanceState) {

      super.onCreate(savedInstanceState);

      setContentView(R.layout.activity_main);

      this.iv_img = (ImageView) this.findViewById(R.id.iv_img);

      WindowManager manager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);

      // 第一种获取手机屏幕宽高的方法

      this.windowHeight = manager.getDefaultDisplay().getHeight();

      this.windowWidth = manager.getDefaultDisplay().getWidth();

      System.out.println("手机宽 :" + this.windowWidth);

      System.out.println("手机高 :" + this.windowHeight);

      // 第二种获取手机屏幕宽高的方法,但是getSize()是从 API Level 13才有的方法

      // Point outSize = new Point();

      // manager.getDefaultDisplay().getSize(outSize );

      // this.windowWidth = outSize.x;

      // this.windowHeight = outSize.y;

     }

     public void load1(View view) {

      String src = "mnt/sdcard/DSC.jpg";

      Bitmap bitmap = BitmapFactory.decodeFile(src);

      this.iv_img.setImageBitmap(bitmap);

     }

     public void load2(View view) {

      String src = "mnt/sdcard/DSC.jpg";

      // 图片解析的配置

      Options options = new Options();

      // 不去真正解析图片,只是获取图片的宽高

      options.inJustDecodeBounds = true;

      BitmapFactory.decodeFile(src, options);

      int imageWidth = options.outWidth;

      int imageHeight = options.outHeight;

      System.out.println("图片宽 :" + imageWidth);

      System.out.println("图片高 :" + imageHeight);

      int scaleX = imageWidth / this.windowWidth;

      int scaleY = imageHeight / this.windowHeight;

      int scale = 1;

      if (scaleX >= scaleY && scaleX >= 1) {

       // 水平方向的缩放比例比竖直方向的缩放比例大,同时图片的宽要比手机屏幕要大,就按水平方向比例缩放

       System.out.println("按宽比例缩放");

       scale = scaleX;

      } else if (scaleY >= scaleX && scaleY >= 1) {

       // 竖直方向的缩放比例比水平方向的缩放比例大,同时图片的高要比手机屏幕要大,就按竖直方向比例缩放

       System.out.println("按高比例缩放");

       scale = scaleY;

      }

      System.out.println("缩放比例:" + scale);

      // 真正解析图片

      options.inJustDecodeBounds = false;

      // 设置采样率

      options.inSampleSize = scale;

      Bitmap bitmap = BitmapFactory.decodeFile(src,options);

      this.iv_img.setImageBitmap(bitmap);

     }

    }

    获取图片exif信息

    public class MainActivity extends Activity {

     @Override

     protected void onCreate(Bundle savedInstanceState) {

      super.onCreate(savedInstanceState);

      setContentView(R.layout.activity_main);

     }

     public void read(View view) {

      try {

       /*

        * ExifInterface.TAG_APERTURE:光圈

        * ExifInterface.TAG_DATETIME:拍摄日期

        * ExifInterface.TAG_EXPOSURE_TIME:曝光时间

        * ExifInterface.TAG_FLASH:闪光灯

        * ExifInterface.TAG_FOCAL_LENGTH:焦距

        * ExifInterface.TAG_GPS_ALTITUDE:海拔

        * ExifInterface.TAG_GPS_ALTITUDE_REF:海拔参数

        * ExifInterface.TAG_GPS_DATESTAMP

        */

       String src = "mnt/sdcard/DCIM/Camera/IMG_20130718_164129.jpg";

    // src = "mnt/sdcard/dog.jpg";

       ExifInterface exif = new ExifInterface(src);

    // String make = exif. getAttribute(ExifInterface.TAG_MAKE);

    // String model = exif.getAttribute(ExifInterface.TAG_MODEL);

    // String datetime = exif.getAttribute(ExifInterface.TAG_DATETIME);

    // Toast.makeText(this, "制造商: " + make, 0).show();

    // Toast.makeText(this, "相机类型: " + model, 0).show();

    // Toast.makeText(this, "拍摄日期:" + datetime, 0).show();

    // System.out.println(exif.getAttribute(ExifInterface.TAG_APERTURE));

       System.out.println(exif.getAttribute(ExifInterface.TAG_DATETIME));

    // System.out.println(exif.getAttribute(ExifInterface.TAG_EXPOSURE_TIME));

       System.out.println(exif.getAttribute(ExifInterface.TAG_FLASH));

       System.out.println(exif.getAttribute(ExifInterface.TAG_FOCAL_LENGTH));

    // System.out.println(exif.getAttribute(ExifInterface.TAG_GPS_ALTITUDE));

    // System.out.println(exif.getAttribute(ExifInterface.TAG_GPS_ALTITUDE_REF));

       System.out.println(exif.getAttribute(ExifInterface.TAG_GPS_DATESTAMP));

       System.out.println(exif.getAttribute(ExifInterface.TAG_GPS_LATITUDE));

       System.out.println(exif.getAttribute(ExifInterface.TAG_GPS_LATITUDE_REF));

       System.out.println(exif.getAttribute(ExifInterface.TAG_GPS_LONGITUDE));

       System.out.println(exif.getAttribute(ExifInterface.TAG_GPS_LONGITUDE_REF));

       System.out.println(exif.getAttribute(ExifInterface.TAG_IMAGE_LENGTH));

       System.out.println(exif.getAttribute(ExifInterface.TAG_IMAGE_WIDTH));

    // System.out.println(exif.getAttribute(ExifInterface.TAG_ISO));

       System.out.println(exif.getAttribute(ExifInterface.TAG_MAKE));

       System.out.println(exif.getAttribute(ExifInterface.TAG_MODEL));

       System.out.println(exif.getAttribute(ExifInterface.TAG_ORIENTATION));

       System.out.println(exif.getAttribute(ExifInterface.TAG_WHITE_BALANCE));

      } catch (Exception e) {

       // TODO Auto-generated catch block

       e.printStackTrace();

      }

     }

    }

    从gallery获取图片

    查看系统gallery应用的源码:

    在清单文件中,我们发现可以通过android.intent.action.PICK这个action来从图库选择一张图片

    <activity android:name="com.android.camera.ImageGallery"

                    android:label="@string/gallery_label"

                    android:configChanges="orientation|keyboardHidden"

                    android:icon="@drawable/ic_launcher_gallery">

                .......

                <intent-filter>

                    <action android:name="android.intent.action.PICK" />

                    <category android:name="android.intent.category.DEFAULT" />

                    <data android:mimeType="image/*" />

                    <data android:mimeType="video/*" />

                </intent-filter>

              .......

               

    </activity>

           

    再查看com.android.camera.ImageGallery类发现,图库会返回图片的全路径和图片的缩略图给我们

    Intent result = new Intent(null, img.fullSizeImageUri());

                if (myExtras != null && myExtras.getBoolean("return-data")) {

                    // The size of a transaction should be below 100K.

                    Bitmap bitmap = img.fullSizeBitmap(

                            IImage.UNCONSTRAINED, 100 * 1024);

                    if (bitmap != null) {

                        result.putExtra("data", bitmap);

                    }

    根据上边的信息,我们可以编写一下代码来获取图库的某种图片

    public class MainActivity extends Activity {

     private ImageView iv_image;

     @Override

     protected void onCreate(Bundle savedInstanceState) {

      super.onCreate(savedInstanceState);

      setContentView(R.layout.activity_main);

      this.iv_image = (ImageView) this.findViewById(R.id.iv_image);

     }

     public void load(View view) {

      // 激活系统图库,选择一张图片

      Intent intent = new Intent();

      intent.setAction(Intent.ACTION_PICK);

      intent.setType("image/*");

      startActivityForResult(intent, 0);

     }

     @Override

     protected void onActivityResult(int requestCode, int resultCode, Intent data) {

      if (data != null) {

       // 得到图片的全路径

       Uri uri = data.getData();

       // 通过路径加载图片

       // this.iv_image.setImageURI(uri);

       try {

        InputStream is = getContentResolver().openInputStream(uri);

        Bitmap bitmap = BitmapFactory.decodeStream(is);

        this.iv_image.setImageBitmap(bitmap);

       } catch (FileNotFoundException e) {

        // TODO Auto-generated catch block

        e.printStackTrace();

       }

       // 获取图片的缩略图,可能为空!

       // Bitmap bitmap = data.getParcelableExtra("data");

       // this.iv_image.setImageBitmap(bitmap);

      }

      super.onActivityResult(requestCode, resultCode, data);

     }

    }

  • 相关阅读:
    ElasticSearch关闭重启命令
    解决使用驱动器中的光盘之前需要将其格式化
    mac利用Synergy操作多台电脑
    一次真实的蓝屏分析 ntkrnlmp.exe
    JS字符串false转boolean
    启明星会议室预定系统更新日志-通用版
    利用Visual Studio 2013 开发微软云Windows Azure配置指南(针对中国大陆)
    利用Bootstrap+Avalonjs+EntityFramework 开发ASP.NET WebForm应用程序(上)
    启明星会议室系统与Office365集成说明
    jQuery中attr和prop方法的区别说明
  • 原文地址:https://www.cnblogs.com/freenovo/p/4469820.html
Copyright © 2011-2022 走看看