1.保存图片到本地
/** * 保存matmap */ public static void saveBitmap(String name,Bitmap bm) { Log.e(TAG, "保存图片"); File f = new File(name); try { f.createNewFile(); } catch (IOException e) { e.printStackTrace(); } try { FileOutputStream out = new FileOutputStream(f); bm.compress(Bitmap.CompressFormat.JPEG, 80, out); out.flush(); out.close(); Log.i("gifname", "已经保存 "+f.getName()); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }2.保留nv21格式缩放bitmap
/** * 缩放bitmap * @param bitmap * @param width 要缩放的宽和高 * @param height * @return */ public static byte[] zoomBitmap(Bitmap bitmap, int width, int height) { int w = bitmap.getWidth(); int h = bitmap.getHeight(); Matrix matrix = new Matrix(); float scaleWidth = ((float) width / w); float scaleHeight = ((float) height / h); matrix.postScale(scaleWidth, scaleHeight); Bitmap newbmp = Bitmap.createBitmap(bitmap, 0, 0, w, h, matrix, true); byte[] datas = getNV21(width,height,newbmp); // ByteArrayOutputStream baos = new ByteArrayOutputStream(); // newbmp.compress(Bitmap.CompressFormat.JPEG, 100, baos); // byte[] datas = baos.toByteArray(); return datas; }
public static byte[] getNV21(int inputWidth, int inputHeight, Bitmap scaled) { int[] argb = new int[inputWidth * inputHeight]; scaled.getPixels(argb, 0, inputWidth, 0, 0, inputWidth, inputHeight); byte[] yuv = new byte[inputWidth * inputHeight * 3 / 2]; encodeYUV420SP(yuv, argb, inputWidth, inputHeight); scaled.recycle(); return yuv; } public static void encodeYUV420SP(byte[] yuv420sp, int[] argb, int width, int height) { final int frameSize = width * height; int yIndex = 0; int uvIndex = frameSize; int a, R, G, B, Y, U, V; int index = 0; for (int j = 0; j < height; j++) { for (int i = 0; i < width; i++) { a = (argb[index] & 0xff000000) >> 24; // a is not used obviously R = (argb[index] & 0xff0000) >> 16; G = (argb[index] & 0xff00) >> 8; B = (argb[index] & 0xff) >> 0; // well known RGB to YUV algorithm Y = ((66 * R + 129 * G + 25 * B + 128) >> 8) + 16; U = ((-38 * R - 74 * G + 112 * B + 128) >> 8) + 128; V = ((112 * R - 94 * G - 18 * B + 128) >> 8) + 128; // NV21 has a plane of Y and interleaved planes of VU each sampled by a factor of 2 // meaning for every 4 Y pixels there are 1 V and 1 U. Note the sampling is every other // pixel AND every other scanline. yuv420sp[yIndex++] = (byte) ((Y < 0) ? 0 : ((Y > 255) ? 255 : Y)); if (j % 2 == 0 && index % 2 == 0) { yuv420sp[uvIndex++] = (byte) ((V < 0) ? 0 : ((V > 255) ? 255 : V)); yuv420sp[uvIndex++] = (byte) ((U < 0) ? 0 : ((U > 255) ? 255 : U)); } index++; } } }
3.byte[]转bitmap
/** * byte[]转bitmap * @param bs * @return */ public static Bitmap Bytes2Bimap(byte[] bs,int w,int h) { YuvImage yuvimage=new YuvImage(bs, ImageFormat.NV21, w,h, null);//20、20分别是图的宽度与高度 ByteArrayOutputStream baos = new ByteArrayOutputStream(); yuvimage.compressToJpeg(new Rect(0, 0,w, h), 80, baos);//80--JPG图片的质量[0-100],100最高 byte[] jdata = baos.toByteArray(); Bitmap bmp = BitmapFactory.decodeByteArray(jdata, 0, jdata.length); return bmp; }
4.bitmap生产gif
public static void createGif(ArrayList<Bitmap> bitmaps, int fps, String path) { SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:MM:ss"); String dateString = simpleDateFormat.format(new Date()); String gifName = path+"/"+ dateString+".gif"; ByteArrayOutputStream baos = new ByteArrayOutputStream(); FileOutputStream fos = null; AnimatedGifEncoder localAnimatedGifEncoder = new AnimatedGifEncoder(); String date = path+"/"+new Date().getTime(); File file2 = new File(date); if(!file2.exists()){ file2.mkdirs(); } localAnimatedGifEncoder.start(baos);//start int i = 0; for (Bitmap bitmap : bitmaps) { i++; localAnimatedGifEncoder.addFrame(bitmap); saveBitmap(date+"/"+i+".jpg",bitmap); } localAnimatedGifEncoder.setRepeat(0);//设置生成gif的开始播放时间。0为立即开始播放 localAnimatedGifEncoder.setDelay(fps); localAnimatedGifEncoder.finish();//finish try { File file = new File(path); if (!file.exists()) file.mkdirs(); Log.d("gifname","gifname : "+gifName); File gifFile = new File(gifName); if(!gifFile.exists()) try { gifFile.createNewFile(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } fos = new FileOutputStream(gifFile); baos.writeTo(fos); baos.flush(); fos.flush(); }catch (Exception e) { e.printStackTrace(); } finally { try { baos.close(); if(fos!=null){ fos.close(); } } catch (IOException e) { e.printStackTrace(); } } }