Android中的Bitmap的详细介绍

Bitmap简介(摘抄于网络)

位图文件(Bitmap),扩展名可以是.bmp或者.dib。位图是Windows标准格式图形文件,它将图像定义为由点(像素)组成,每个点可以由多种色彩表示,包括2、4、8、16、24和32位色彩。

例如,一幅1024×768分辨率的32位真彩图片,其所占存储字节数为:1024×768×32/(8*1024)=3072KB

位图文件图像效果好,但是非压缩格式的,需要占用较大存储空间,不利于在网络上传送。jpg/png格式则恰好弥补了位图文件的缺点。

在Android中计算bitmap的大小:bitmap.getByteCount()(返回byte)

扫盲:1M=1024KB=1024*1024byte

一般1920X1080尺寸的图片在内存中的大小,1920x1080x4=2025kb=1.977539M
乘以4位的原因是在安卓系统中bitmap图片一般是以ARGB_8888(ARGB分别代表的是透明度,红色,绿色,蓝色,每个值分别用8bit来记录,也就是一个像素会占用4byte,共32bit。)来进行存储的。

Android中图片有四种颜色格式

颜色格式 每个像素占用内存(单位byte) 每个像素占用内存(单位bit)
ALPHA_8 1 8
ARGB_8888(默认) 4 32
ARGB_4444 2 16
RGB_565 2 16

ARGB_8888占位算法: 8+8+8+8 =32

1 bit   0/1 ;最小单位

1 byte = 8bit      10101010  (0-255)00000000  ---  11111111

说明:

ARGB_8888:ARGB分别代表的是透明度,红色,绿色,蓝色,每个值分别用8bit来记录,也就是一个像素会占用4byte,共32bit.

ARGB_4444:ARGB的是每个值分别用4bit来记录,一个像素会占用2byte,共16bit.

RGB_565:R=5bit,G=6bit,B=5bit,不存在透明度,每个像素会占用2byte,共16bit.

ALPHA_8:该像素只保存透明度,会占用1byte,共8bit.

在实际应用中而言,建议使用ARGB_8888以及RGB_565。

如果你不需要透明度,那么就选择RGB_565,可以减少一半的内存占用.

Bitmap的回收

在安卓3.0以前Bitmap是存放在堆中的,我们只要回收堆内存即可

在安卓3.0以后Bitmap是存放在内存中的,我们需要回收native层和Java层的内存

官方建议我们3.0以后使用recycle方法进行回收,该方法也可以不主动调用,因为垃圾回收器会自动收集不可用的Bitmap对象进行回收

recycle方法会判断Bitmap在不可用的情况下,将发送指令到垃圾回收器,让其回收native层和Java层的内存,则Bitmap进入dead状态

recycle方法是不可逆的,如果再次调用getPixels()等方法,则获取不到想要的结果

LruCache原理

LruCache是个泛型类,内部采用LinkedHashMap来实现缓存机制,它提供get方法和put方法来获取缓存和添加缓存,其最重要的方法trimToSize是用来移除最少使用的缓存和使用最久的缓存,并添加最新的缓存到队列中

计算inSampleSize

  public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
    final int width = options.outWidth;
    final int height = options.outHeight;
    int inSampleSize = 1;

    if (width > reqWidth || height > reqHeight) {
      if (width > height) {
        inSampleSize = Math.round((float) height / (float) reqHeight);
      } else {
        inSampleSize = Math.round((float) width / (float) reqWidth);
      }
    }
    return inSampleSize;
  }

缩略图

  public static Bitmap thumbnail(String path, int maxWidth, int maxHeight,boolean autoRotate) {
    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    Bitmap bitmap = BitmapFactory.decodeFile(path);
    options.inJustDecodeBounds = false;
    int sampleSize = calculateInSampleSize(options,maxWidth,maxHeight);
    options.inSampleSize =sampleSize;
    options.inPreferredConfig = Bitmap.Config.RGB_565;
    options.inPurgeable =true;
    options.inInputShareable = true;
    if(bitmap !=null&&!bitmap.isRecycled()){
      bitmap.recycle();
    }
    bitmap = BitmapFactory.decodeFile(path,options);
    return bitmap;
  }

保存Bitmap

public static String save(Bitmap bitmap, Bitmap.CompressFormat format, int quality,File desFile) {
    try{
      FileOutputStream out = new FileOutputStream(desFile);
      if(bitmap.compress(format,quality,out)){
        out.flush();
        out.close();
      }
      if(bitmap!=null&&!bitmap.isRecycled()){
        bitmap.recycle();
      }
      return desFile.getAbsolutePath();
    }catch (FileNotFoundException e){
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
    return null;
  }

保存到SD卡

public static String save(Bitmap bitmap, Bitmap.CompressFormat format, int quality,Context context) {
    if(!Environment.getExternalStorageState()
        .equals(Environment.MEDIA_MOUNTED)){
      return null;
    }
    File dir = new File(Environment.getExternalStorageDirectory()+
    "/"+context.getPackageName());
    if(!dir.exists()){
      dir.mkdir();
    }
    File desFile = new File(dir, UUID.randomUUID().toString());
    return save(bitmap,format,quality,desFile);
  }

压缩

一、质量压缩

质量压缩方法:在保持像素的前提下改变图片的位深及透明度等,来达到压缩图片的目的:

1、bitmap图片的大小不会改变

2、bytes.length是随着quality变小而变小的。

这样适合去传递二进制的图片数据,比如分享图片,要传入二进制数据过去,限制500kb之内。

public static Bitmap compressImage(Bitmap image) {
  ByteArrayOutputStream baos = new ByteArrayOutputStream();
  // 把ByteArrayInputStream数据生成图片
  Bitmap bitmap = null;
  image.compress(Bitmap.CompressFormat.JPEG, 5, baos);
  byte[] bytes = baos.toByteArray();
  // 把压缩后的数据baos存放到bytes中
  bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
  if (bitmap != null) {
    loga(bitmap, baos.toByteArray());
  }
  return bitmap;
}

// 质量压缩方法,options的值是0-100,这里100表示原来图片的质量,不压缩,把压缩后的数据存放到baos中
image.compress(Bitmap.CompressFormat.JPEG, 100, baos);
int options = 90;
// 循环判断如果压缩后图片是否大于500kb,大于继续压缩
while (baos.toByteArray().length / 1024 > 100) {
  // 重置baos即清空baos
  baos.reset();
  // 这里压缩options%,把压缩后的数据存放到baos中
  image.compress(Bitmap.CompressFormat.JPEG, options, baos);
  // 每次都减少10
  if(options == 1){
    break;
  }else if (options <= 10) {
    options -= 1;
  } else {
    options -= 10;
  }
}

二、采样率压缩

设置inSampleSize的值(int类型)后,假如设为n,则宽和高都为原来的1/n,宽高都减少,内存降低。上面的代码没用过options.inJustDecodeBounds = true; 因为我是固定来取样的数据,为什么这个压缩方法叫采样率压缩?

是因为配合inJustDecodeBounds,先获取图片的宽、高(这个过程就是取样)。

然后通过获取的宽高,动态的设置inSampleSize的值。 当inJustDecodeBounds设置为true的时候, BitmapFactory通过decodeResource或者decodeFile解码图片时, 将会返回空(null)的Bitmap对象,这样可以避免Bitmap的内存分配, 但是它可以返回Bitmap的宽度、高度以及MimeType。

用法

int inSampleSize = getScaling(bitmap); bitmap = samplingRateCompression(path,inSampleSize);
private Bitmap samplingRateCompression(String path, int scaling) {

BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = scaling;

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

int size = (bitmap.getByteCount() / 1024 / 1024);

Log.i("wechat", "压缩后图片的大小" + (bitmap.getByteCount() / 1024 / 1024)
    + "M宽度为" + bitmap.getWidth() + "高度为" + bitmap.getHeight());
return bitmap;
}

/**
* 获取缩放比例
* @param bitmap
* @return
*/
private int getScaling(Bitmap bitmap) {
  //设置目标尺寸(以像素的宽度为标准)
  int Targetsize = 1500;
  int width = bitmap.getWidth();
  int height = bitmap.getHeight();
  //选择最大值作为比较值(保证图片的压缩大小)
  int handleValue = width > height ? width : height;
  //循环计算压缩比
  int i = 1;
  while (handleValue / i > Targetsize) {
    i++;
  }
}

三、缩放法压缩, 效果和方法2一样

Android中使用Matrix对图像进行缩放、旋转、平移、斜切等变换的。 Matrix是一个3*3的矩阵,其值对应如下:
|scaleX,  skewX,  translateX|
|skewY,  scaleY,  translateY|
|0  , 0 ,   scale |

Matrix提供了一些方法来控制图片变换:

  1. setTranslate(float dx,float dy):控制Matrix进行位移。
  2. setSkew(float kx,float ky):控制Matrix进行倾斜,kx、ky为X、Y方向上的比例。
  3. setSkew(float kx,float ky,float px,float py):控制Matrix以px、py为轴心进行倾斜,kx、ky为X、Y方向上的倾斜比例。
  4. setRotate(float degrees):控制Matrix进行depress角度的旋转,轴心为(0,0)。
  5. setRotate(float degrees,float px,float py):控制Matrix进行depress角度的旋转,轴心为(px,py)。
  6. setScale(float sx,float sy):设置Matrix进行缩放,sx、sy为X、Y方向上的缩放比例。
  7. setScale(float sx,float sy,float px,float py):设置Matrix以(px,py)为轴心进行缩放,sx、sy为X、Y方向上的缩放比例。

注意:以上的set方法,均有对应的post和pre方法,Matrix调用一系列set,pre,post方法时,可视为将这些方法插入到一个队列. 当然,按照队列中从头至尾的顺序调用执行. 其中pre表示在队头插入一个方法,post表示在队尾插入一个方法. 而set表示把当前队列清空,并且总是位于队列的最中间位置. 当执行了一次set后: pre方法总是插入到set前部的队列的最前面,post方法总是插入到set后部的队列的最后面

private Bitmap ScalingCompression(Bitmap bitmap) {
  Matrix matrix = new Matrix();
  matrix.setScale(0.25f, 0.25f);//缩放效果类似于方法2
  Bitmap bm = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(),
    bitmap.getHeight(), matrix, true);
  Log.i("wechat", "压缩后图片的大小" + (bm.getByteCount() / 1024 / 1024)
    + "M宽度为" + bm.getWidth() + "高度为" + bm.getHeight());
  return bm;
}

四、Bitmap.Config

原图尺寸:4M----转化为File---Bitmap大小

  1. ALPHA_8----------6.77M -------45M
  2. ARGB_4444-------9.37M -------22M
  3. ARGB_8888-------6.77M -------45M
  4. RGB_565-----------8.13M -------22M

一般情况下默认使用的是ARGB8888,由此可知它是最占内存的,因为一个像素占32位,8位=1字节,所以一个像素占4字节的内存。假设有一张480x800的图片,如果格式为ARGB8888,那么将会占用1500KB的内存。

private Bitmap bitmapConfig(String path) {
  BitmapFactory.Options options = new BitmapFactory.Options();
  options.inPreferredConfig = Bitmap.Config.RGB_565;

  Bitmap bm = BitmapFactory.decodeFile(path, options);
  Log.i("wechat", "压缩后图片的大小" + (bm.getByteCount() / 1024f / 1024f)
  + "M宽度为" + bm.getWidth() + "高度为" + bm.getHeight());
  return bm;
}

五、Bitmap提供的:createScaledBitmap

方法

Bitmap.createScaledBitmap(src, dstWidth, dstHeight, filter);

参数说明:

  1. src  用来构建子集的源位图
  2. dstWidth   新位图期望的宽度
  3. dstHeight  新位图期望的高度
  4. filter     为true则选择抗锯齿

补充抗锯齿的知识点

在Android中,目前,我知道有两种出现锯齿的情况。

1、当我们用Canvas绘制位图的时候,如果对位图进行了选择,则位图会出现锯齿。
2、在用View的RotateAnimation做动画时候, 如果View当中包含有大量的图形,也会出现锯齿。

我们分别以这两种情况加以考虑。 用Canvas绘制位图的的情况。 在用Canvas绘制位图时,一般地,我们使用drawBitmap函数家族, 在这些函数中,都有一个Paint参数, 要做到防止锯齿,我们就要使用到这个参数。如下:

首先在你的构造函数中,需要创建一个Paint。 Paint mPaint = new Paint();

然后,您需要设置两个参数:

1)mPaint.setAntiAlias(Boolean aa);
2)mPaint.setBitmapFilter(true)。

第一个函数是用来防止边缘的锯齿, (true时图像边缘相对清晰一点,锯齿痕迹不那么明显, false时,写上去的字不饱满,不美观,看地不太清楚)。

第二个函数是用来对位图进行滤波处理。

最后,在画图的时候,调用drawBitmap函数,只需要将整个Paint传入即可。

有时候,当你做RotateAnimation时, 你会发现,讨厌的锯齿又出现了。 这个时候,由于你不能控制位图的绘制, 只能用其他方法来实现防止锯齿。 另外,如果你画的位图很多。 不想每个位图的绘制都传入一个Paint。 还有的时候,你不可能控制每个窗口的绘制的时候, 您就需要用下面的方法来处理——对整个Canvas进行处理。

1)在您的构造函数中,创建一个Paint滤波器。 PaintFlagsDrawFilter mSetfil = new PaintFlagsDrawFilter(0, Paint.FILTERBITMAPFLAG); 第一个参数是你要清除的标志位, 第二个参数是你要设置的标志位。此处设置为对位图进行滤波。

2)当你在画图的时候, 如果是View则在onDraw当中,如果是ViewGroup则在dispatchDraw中调用如下函数。 canvas.setDrawFilter( mSetfil );

另外,在Drawable类及其子类中, 也有函数setFilterBitmap可以用来对Bitmap进行滤波处理, 这样,当你选择Drawable时,会有抗锯齿的效果。

private Bitmap createScaledBitmap(Bitmap bitmap) {
  Bitmap bm = Bitmap.createScaledBitmap(bitmap, 200, 200, true);
  Log.i("wechat", "压缩后图片的大小" + (bm.getByteCount() / 1024) + "KB宽度为"
    + bm.getWidth() + "高度为" + bm.getHeight());
  return bm;
}

六、辅助方法(上述方法的):

通过路径获取bitmap的方法

1、利用BitmapFactory解析文件,转换为Bitmap

bitmap = BitmapFactory.decodeFile(path);

2、自己写解码,转换为Bitmap过程, 同样需使用BitmapFactory.decodeByteArray(buf, 0, len);代码如下:

private Bitmap getBitmapByPath(String path) {
if (!new File(path).exists()) {
  System.err.println("getBitmapByPath: 文件不存在");
  return null;
}
byte[] buf = new byte[1024 * 1024];// 1M
Bitmap bitmap = null;
try {
  FileInputStream fis = new FileInputStream(path);
  int len = fis.read(buf, 0, buf.length);
  bitmap = BitmapFactory.decodeByteArray(buf, 0, len);
  //当bitmap为空的时候,说明解析失败
  if (bitmap == null) {
    System.out.println("文件长度:" + len);
    System.err.println("path: " + path + " 无法解析!!!");
  }
} catch (Exception e) {
  e.printStackTrace();
}
return bitmap;
}

保存图片

private void savaPictrue(Bitmap bitmap) {
  File file = new File("storage/emulated/0/DCIM/Camera/test.jpg");
  FileOutputStream stream = null;
  try {
    stream = new FileOutputStream(file);
    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
    Log.e("图片大小:", file.length() / 1024 / 1024 + "M");
  } catch (Exception e) {
    e.printStackTrace();
  }
}

剪切图片(这里只是裁剪图片,但是对图片的大小并不影响)

private void crop(Uri uri) {
  // 裁剪图片意图
  Intent intent = new Intent("com.android.camera.action.CROP");
  intent.setDataAndType(uri, "image/*");
  intent.putExtra("crop", "true");
  // 裁剪框的比例,1:1
  intent.putExtra("aspectX", 1);
  intent.putExtra("aspectY", 1);
  // 裁剪后输出图片的尺寸大小
  intent.putExtra("outputX", 300);
  intent.putExtra("outputY", 300);

  intent.putExtra("outputFormat", "JPEG");// 图片格式
  intent.putExtra("noFaceDetection", true);// 取消人脸识别
  intent.putExtra("return-data", true);
  // 开启一个带有返回值的Activity,请求码为PHOTO_REQUEST_CUT
  startActivityForResult(intent, 200);
}

private void logp(Bitmap bitmap) {
Log.i("wechat", "压缩前图片的大小" + (bitmap.getByteCount() / 1024 / 1024)
    + "M宽度为" + bitmap.getWidth() + "高度为" + bitmap.getHeight());
}

private static void loga(Bitmap bitmap, byte[] bytes) {
  Log.i("wechat", "压缩后图片的大小" + (bitmap.getByteCount() / 1024 / 1024)
    + "M宽度为" + bitmap.getWidth() + "高度为" + bitmap.getHeight()
    + "bytes.length= " + (bytes.length / 1024) + "KB"
  );
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android Bitmap详细介绍

    复制代码 代码如下: package com.testbitmapscale; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.Iterator; import com.testbitmapscale.R.drawable; im

  • Android截取视频帧并转化为Bitmap示例

    MainActivity如下: 复制代码 代码如下: package cn.testmediametadataretriever; import java.io.File; import java.io.FileOutputStream; import android.media.MediaMetadataRetriever; import android.os.Bundle; import android.os.Environment; import android.app.Activity;

  • Android中使用Bitmap类将矩形图片转为圆形的方法

    一般要做正圆形图片,只能是正方形的基础上才能实现,否则就变成椭圆了,下面说说如何使长方形的图片生成正圆形图片 废话不多说,没图没真相,先上图吧: 原图: 变成正圆后: 下面上代码: public static Bitmap makeRoundCorner(Bitmap bitmap) { int width = bitmap.getWidth(); int height = bitmap.getHeight(); int left = 0, top = 0, right = width, bot

  • android将Bitmap对象保存到SD卡中的方法

    本文实例讲述了android将Bitmap对象保存到SD卡中的方法.分享给大家供大家参考.具体如下: Bitmap logoBitmap = BitmapFactory.decodeResource(mcontext.getResources(), R.drawable.arcnote_logo); ByteArrayOutputStream logoStream = new ByteArrayOutputStream(); boolean res = logoBitmap.compress(B

  • android中Bitmap的放大和缩小实例代码

    复制代码 代码如下: /**Bitmap放大的方法*/ private static Bitmap big(Bitmap bitmap) { Matrix matrix = new Matrix(); matrix.postScale(1.5f,1.5f); //长和宽放大缩小的比例 Bitmap resizeBmp = Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),bitmap.getHeight(),matrix,true); return

  • android通过bitmap生成新图片关键性代码

    1.关键性代码 复制代码 代码如下: //R.drawable.test为当前工程里的一张图片 Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.test); FileOutputStream fos = null; try { File file = new File("/mnt/sdcard/testfile"); if (!file.exists()) { file.mkdir(); }

  • android bitmap compress(图片压缩)代码

    android的照相功能随着手机硬件的发展,变得越来越强大,能够找出很高分辨率的图片.有些场景中,需要照相并且上传到服务,但是由于图片的大小太大,那么就上传就会很慢(在有些网络情况下),而且很耗流量,要想速度快,那么就需要减小图片的大小.减少图片的大小有两种方法,1. 照小图片: 2. 压缩大图片. 照相时获取小图片一般不太符合要求,因为,图片的清晰度会很差,但是这种情况有个好处就是应用速度会快些: 压缩图片,就是把大图片压缩小,降低图片的质量,在一定范围内,降低图片的大小,并且满足需求(图片仍

  • Android读取本地或网络图片并转换为Bitmap

    在做android项目时,我们经常需要从本地或者网络读取图片,并转换为Bitmap图片,以便使用,下面是读取本地图片并转换的方法: Java代码 /** * 得到本地或者网络上的bitmap url - 网络或者本地图片的绝对路径,比如: * * A.网络路径: url="http://blog.foreverlove.us/girl2.png" ; * * B.本地路径:url="file://mnt/sdcard/photo/image.png"; * * C.

  • Android中的Bitmap的详细介绍

    Bitmap简介(摘抄于网络) 位图文件(Bitmap),扩展名可以是.bmp或者.dib.位图是Windows标准格式图形文件,它将图像定义为由点(像素)组成,每个点可以由多种色彩表示,包括2.4.8.16.24和32位色彩. 例如,一幅1024×768分辨率的32位真彩图片,其所占存储字节数为:1024×768×32/(8*1024)=3072KB 位图文件图像效果好,但是非压缩格式的,需要占用较大存储空间,不利于在网络上传送.jpg/png格式则恰好弥补了位图文件的缺点. 在Android

  • Android中View绘制流程详细介绍

    创建Window Window即窗口,这个概念在AndroidFramework中的实现为android.view.Window这个抽象类,这个抽象类是对Android系统中的窗口的抽象.在介绍这个类之前,我们先来看看究竟什么是窗口呢? 实际上,窗口是一个宏观的思想,它是屏幕上用于绘制各种UI元素及响应用户输入事件的一个矩形区域.通常具备以下两个特点: 独立绘制,不与其它界面相互影响: 不会触发其它界面的输入事件: 在Android系统中,窗口是独占一个Surface实例的显示区域,每个窗口的S

  • Android中的Looper对象详细介绍

    Java 官网对Looper对象的说明: public class Looperextends ObjectClass used to run a message loop for a thread. Threads by default do not have a message loop associated with them; to create one, call prepare() in the thread that is to run the loop, and then loo

  • Android中卡顿优化布局详细介绍

    目录 背景 实践过程 如何渲染界面 什么是过度绘制 如何查看绘制维度 界面优化 硬件加速原理 总结 背景 在当下移动互联网后半场,手机已经是人手必备的设备.App是离用户最近的应用,界面又是最直观影响用户体验的关键部分,其流畅度直接影响用户对产品的评价和留存. 技术是服务于人的,如果技术无法给你带来良好的体验,那技术本身的存在就具有争议. 所以界面性能是至关重要的,不可忽视. 实践过程 布局代码是最基础的,但也是最重要的. 首先我们看个简单小案例 不同深浅的颜色来表示过度绘制: 没颜色:没有过度

  • Android Activity的生命周期详细介绍

    Android Activity的生命周期详细介绍 生命周期描述的是一个类从创建(new出来)到死亡(垃圾回收)的过程中会执行的方法.在这个过程中,会针对不同的生命阶段调用不同的的方法. Activity是Android中四大组件之一,是最常见的应用组件,也是用的最多的组件,它能够提供一个界面与用户进行交互.Activity从创建到销毁有多种状态,从一种状态到另一种状态时会激发相应的回调方法,这些回调方法包括:onCreate  onDestory  onStart  onStop  onRes

  • Android中的Bitmap序列化失败的解决方法

    之前写了个User类(实现了Serializable接口),类变量里有Bitmap类型的头像图片,Bitmap导致序列化不成功,报 "android.graphics.Bitmap"相关错误 解决方法之一:把Bitmap对象替换成byte数组来表示间接表示图片,在需要Bitmap的时候再讲byte数组转换成Bitmap对象.这是因为byte数组和Bitmap之间的可以转化,实现也比较方便. 附byte数组与Bitmap的相互转换方法: Bitmap转换成byte数组 private b

  • Android中各种Time API详细

    目录 1.时间API 2.uptimeMillis() vs nanoTime() 3.uptimeMillis() 实现 4.nanoTime() 实现 1.时间API 为了跟踪性能,我们需要测量时间间隔,即两个时间点之间的差异. JDK 为我们提供了两种获取当前时间的方法: // Milliseconds since Unix epoch (00:00:00 UTC on 1 January 1970) System.currentTimeMillis() // Nanoseconds si

  • vue中mint-ui环境搭建详细介绍

     vue中mint-ui环境搭建详细介绍 首先需要如下配置node (最好用淘宝源) $ npm install -g cnpm --registry=https://registry.npm.taobao.org 以及git 从官方github拉下来mint-ui git clone https://github.com/ElemeFE/mint-ui.git 进入mint-ui npm run dev 全程大概5-10分钟,出现 Build completed in 34.926s Chil

  • canvas 画布在主流浏览器中的尺寸限制详细介绍

    canvas 画布在主流浏览器中的尺寸限制详细介绍 通过测试发现,canvas在不同浏览器下面有不同的最大尺寸限制. 大家都知道,canvas有自身的width,height属性来控制尺寸,用css的width,height,控制显示的大小.可以理解为canvas就是一个img,属性的width,height就是这个img的原图像素大小.但在各浏览器下,设置canvas尺寸时发现有最大尺寸限制.测试一下与大家分享. 测试代码 <!DOCTYPE html> <html> <h

  • PHP中error_reporting函数用法详细介绍

    PHP中error_reporting函数用法详细介绍 PHP中对错误的处理会用到error_reporting函数,看到最多的是error_reporting(E_ALL ^ E_NOTICE),这个是什么意思呢?下面我们具体分析error_reporting函数. 定义用法 error_reporting() 设置 PHP 的报错级别并返回当前级别. 语法 error_reporting(report_level) 如果参数 report_level 未指定,当前报错级别将被返回.下面几项是

随机推荐