通过一个 String 类型的 imgUrl 获得文件字节数组
try {
URL url = new URL(imgUrl)
HttpURLConnection conn = (HttpURLConnection) url.openConnection ()
conn.setRequestMethod ("GET" )
conn.setReadTimeout (10000 )
if (conn.getResponseCode () == 200 ) {
InputStream in = conn.getInputStream ()
ByteArrayOutputStream out = new ByteArrayOutputStream()
byte[] bytes = new byte[1024 ]
int length = -1
while ((length = in .read (bytes)) != -1 ) {
out .write (bytes, 0 , length)
}
picByte = out .toByteArray ()
in .close ()
out .close ()
}
} catch (IOException e) {
e.printStackTrace ()
}
public abstract class BaseActivity extends AppCompatActivity implements View .OnClickListener {
protected Context mContext;
@Override
protected void onCreate (@Nullable Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(getLayoutId());
mContext = this ;
initDataBeforeView();
initView();
initData();
initEvent();
}
protected abstract int getLayoutId ();
protected abstract void initView ();
protected abstract void initData ();
protected void initDataBeforeView () {
}
protected void initEvent (){
}
}
public abstract class BaseFragment extends Fragment {
protected BaseActivity mActivity;
@Override
public void onAttach (Context context) {
super .onAttach(context);
mActivity = (BaseActivity) this .getActivity();
}
@Nullable
@Override
public View onCreateView (LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(getLyoutId(),container,false );
}
@Override
public void onViewCreated (View view, @Nullable Bundle savedInstanceState) {
super .onViewCreated(view, savedInstanceState);
initView(view);
}
@Override
public void onCreate (@Nullable Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
initData(savedInstanceState);
}
protected abstract int getLyoutId ();
protected abstract void initView (View view);
protected abstract void initData (Bundle savedInstanceState);
}
public class RegexUtils {
/**
* 匹配全网IP的正则表达式
*/
public static final String IP_REGEX = "^((?:(?:25[0-5]|2[0-4]\\d|((1\\d{2})|([1-9]?\\d)))\\.){3}(?:25[0-5]|2[0-4]\\d|((1\\d{2})|([1-9]?\\d))))$" ;
/**
* 匹配手机号码的正则表达式
* <br>支持130——139、150——153、155——159、180、183、185、186、188、189号段
*/
public static final String PHONE_NUMBER_REGEX = "^1{1}(3{1}\\d{1}|5{1}[012356789]{1}|8{1}[035689]{1})\\d{8}$" ;
/**
*
*/
public static final String PHONE_NUMBER_FULL = "((^(13|15|18|17)[0-9]{9}$)|(^0[1,2]{1}\\d{1}-?\\d{8}$)|(^0[3-9] {1}\\d{2}-?\\d{7,8}$)|(^0[1,2]{1}\\d{1}-?\\d{8}-(\\d{1,4})$)|(^0[3-9]{1}\\d{2}-? \\d{7,8}-(\\d{1,4})$))" ;
/**
* 匹配邮箱的正则表达式
* <br>"www."可省略不写
*/
public static final String EMAIL_REGEX = "^(www\\.)?\\w+@\\w+(\\.\\w+)+$" ;
/**
* 匹配汉子的正则表达式,个数限制为一个或多个
*/
public static final String CHINESE_REGEX = "^[\u4e00-\u9f5a]+$" ;
/**
* 匹配正整数的正则表达式,个数限制为一个或多个
*/
public static final String POSITIVE_INTEGER_REGEX = "^\\d+$" ;
/**
* 匹配身份证号的正则表达式
*/
public static final String ID_CARD = "^(^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}$)|(^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])((\\d{4})|\\d{3}[Xx])$)$" ;
/**
* 匹配邮编的正则表达式
*/
public static final String ZIP_CODE = "^\\d{6}$" ;
/**
* 匹配URL的正则表达式
*/
public static final String URL = "^(([hH][tT]{2}[pP][sS]?)|([fF][tT][pP]))\\:\\/\\/[wW]{3}\\.[\\w-]+\\.\\w{2,4}(\\/.*)?$" ;
/**
* 匹配给定的字符串是否是一个邮箱账号,"www."可省略不写
*
* @param string 给定的字符串
* @return true:是
*/
public static boolean isEmail (String string) {
return string.matches(EMAIL_REGEX);
}
/**
* 匹配给定的字符串是否是一个手机号码,支持130——139、150——153、155——159、180、183、185、186、188、189号段
*
* @param string 给定的字符串
* @return true:是
*/
public static boolean isMobilePhoneNumber (String string) {
return string.matches(PHONE_NUMBER_REGEX);
}
/**
* 匹配给定的字符串是否是一个全网IP
*
* @param string 给定的字符串
* @return true:是
*/
public static boolean isIp (String string) {
return string.matches(IP_REGEX);
}
/**
* 匹配给定的字符串是否全部由汉子组成
*
* @param string 给定的字符串
* @return true:是
*/
public static boolean isChinese (String string) {
return string.matches(CHINESE_REGEX);
}
/**
* 验证给定的字符串是否全部由正整数组成
*
* @param string 给定的字符串
* @return true:是
*/
public static boolean isPositiveInteger (String string) {
return string.matches(POSITIVE_INTEGER_REGEX);
}
/**
* 验证给定的字符串是否是身份证号
* <br>
* <br>身份证15位编码规则:dddddd yymmdd xx p
* <br>dddddd:6位地区编码
* <br>yymmdd:出生年(两位年)月日,如:910215
* <br>xx:顺序编码,系统产生,无法确定
* <br>p:性别,奇数为男,偶数为女
* <br>
* <br>
* <br>身份证18位编码规则:dddddd yyyymmdd xxx y
* <br>dddddd:6位地区编码
* <br>yyyymmdd:出生年(四位年)月日,如:19910215
* <br>xxx:顺序编码,系统产生,无法确定,奇数为男,偶数为女
* <br>y:校验码,该位数值可通过前17位计算获得
* <br>前17位号码加权因子为 Wi = [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 ]
* <br>验证位 Y = [ 1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2 ]
* <br>如果验证码恰好是10,为了保证身份证是十八位,那么第十八位将用X来代替 校验位计算公式:Y_P = mod( ∑(Ai×Wi),11 )
* <br>i为身份证号码1...17 位; Y_P为校验码Y所在校验码数组位置
*
* @param string
* @return
*/
public static boolean isIdCard (String string) {
return string.matches(ID_CARD);
}
/**
* 验证给定的字符串是否是邮编
*
* @param string
* @return
*/
public static boolean isZipCode (String string) {
return string.matches(ZIP_CODE);
}
/**
* 验证给定的字符串是否是URL,仅支持http、https、ftp
*
* @param string
* @return
*/
public static boolean isURL (String string) {
return string.matches(URL);
}
}
public class SDCardUtils {
/**
* 获取SD卡的状态
*/
public static String getState () {
return Environment.getExternalStorageState();
}
/**
* SD卡是否可用
*
* @return 只有当SD卡已经安装并且准备好了才返回true
*/
public static boolean isAvailable () {
return getState().equals(Environment.MEDIA_MOUNTED);
}
/**
* 获取SD卡的根目录
*
* @return null:不存在SD卡
*/
public static File getRootDirectory () {
return isAvailable() ? Environment.getExternalStorageDirectory() : null ;
}
/**
* 获取SD卡的根路径
*
* @return null:不存在SD卡
*/
public static String getRootPath () {
File rootDirectory = getRootDirectory();
return rootDirectory != null ? rootDirectory.getPath() : null ;
}
/**
*获取sd卡路径
* @return Stringpath
*/
public static String getSDPath (){
File sdDir = null ;
boolean sdCardExist = Environment.getExternalStorageState()
.equals(Environment.MEDIA_MOUNTED);
if (sdCardExist)
{
sdDir = Environment.getExternalStorageDirectory();
}
return sdDir.toString();
}
}
public class TimeUtils {
public static final SimpleDateFormat DEFAULT_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss" );
public static final SimpleDateFormat DATE_FORMAT_DATE = new SimpleDateFormat("yyyy-MM-dd" );
public static final SimpleDateFormat DATE_IMG_DATE = new SimpleDateFormat("yyyyMMdd_hhmmss" );
private TimeUtils () {
throw new AssertionError();
}
/**
* long time to string
*
* @param timeInMillis timeInMillis
* @param dateFormat dateFormat
* @return String
*/
public static String getTime (long timeInMillis, SimpleDateFormat dateFormat) {
return dateFormat.format(new Date(timeInMillis));
}
/**
* 获取系统时间 格式 20160101_112233
*
* @return
*/
public static String getTimeForImg () {
return getTime(getCurrentTimeInLong(), DATE_IMG_DATE);
}
/**
* long time to string, format is {@link #DEFAULT_DATE_FORMAT}
*
* @param timeInMillis time
* @return String
*/
public static String getTime (long timeInMillis) {
return getTime(timeInMillis, DEFAULT_DATE_FORMAT);
}
/**
* get current time in milliseconds
*
* @return long
*/
public static long getCurrentTimeInLong () {
return System.currentTimeMillis();
}
/**
* get current time in milliseconds, format is {@link #DEFAULT_DATE_FORMAT}
*
* @return String
*/
public static String getCurrentTimeInString () {
return getTime(getCurrentTimeInLong());
}
/**
* get current time in milliseconds
*
* @param dateFormat dateFormat
* @return String
*/
public static String getCurrentTimeInString (SimpleDateFormat dateFormat) {
return getTime(getCurrentTimeInLong(), dateFormat);
}
}
public class Utils {
/**
* Map a value within a given range to another range.
* @param value the value to map
* @param fromLow the low end of the range the value is within
* @param fromHigh the high end of the range the value is within
* @param toLow the low end of the range to map to
* @param toHigh the high end of the range to map to
* @return the mapped value
*/
public static double mapValueFromRangeToRange (
double value,
double fromLow,
double fromHigh,
double toLow,
double toHigh) {
double fromRangeSize = fromHigh - fromLow;
double toRangeSize = toHigh - toLow;
double valueScale = (value - fromLow) / fromRangeSize;
return toLow + (valueScale * toRangeSize);
}
/**
* set margins of the specific view
* @param target
* @param l
* @param t
* @param r
* @param b
*/
public static void setMargin (View target, int l, int t, int r, int b){
if (target.getLayoutParams() instanceof ViewGroup.MarginLayoutParams) {
ViewGroup.MarginLayoutParams p = (ViewGroup.MarginLayoutParams) target.getLayoutParams();
p.setMargins(l, t, r, b);
target.requestLayout();
}
}
/**
* convert drawable to bitmap
* @param drawable
* @return
*/
public static Bitmap drawableToBitmap (Drawable drawable) {
int width = drawable.getIntrinsicWidth();
int height = drawable.getIntrinsicHeight();
Bitmap bitmap = Bitmap.createBitmap(width, height, drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565);
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0 , 0 , width, height);
drawable.draw(canvas);
return bitmap;
}
}
public class NetworkUtils {
public static boolean isNetWorkConnet (Context context){
ConnectivityManager con=(ConnectivityManager)context.getSystemService(Activity.CONNECTIVITY_SERVICE);
boolean wifi=con.getNetworkInfo(ConnectivityManager.TYPE_WIFI).isConnectedOrConnecting();
boolean internet=con.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).isConnectedOrConnecting();
if (wifi|internet){
return true ;
}else {
Toast.makeText(context, "网络连了么?" , Toast.LENGTH_LONG)
.show();
return false ;
}
}
}
public class MyToast {
private static Toast toast;
public static void showToast (Context context, String msg) {
if (toast==null ){
toast=Toast.makeText(context, msg, Toast.LENGTH_SHORT);
}else
toast.setText(msg);
toast.show();
}
}
public class FileUtil {
private static String TAG = "图片相关:" ;
/**
* 生成文件夹
*
* @param filePath
*/
public static void makeRootDirectory (String filePath) {
File file = null ;
try {
file = new File(filePath);
if (!file.exists()) {
file.mkdir();
} else {
}
} catch (Exception e) {
Log.i("error:" , e + "" );
}
}
/**
* 生成文件
*
* @param filePath
* @param fileName
* @return
*/
public static File makeFilePath (String filePath, String fileName) {
File file = null ;
makeRootDirectory(filePath);
try {
file = new File(filePath + fileName);
if (!file.exists()) {
file.createNewFile();
}
} catch (Exception e) {
Log.e(TAG, "图片保存出错:" + e.toString());
}
return file;
}
}
public class Countdown implements Runnable {
private int remainingSeconds;
private int currentRemainingSeconds;
private boolean running;
private String defaultText;
private String countdownText;
private TextView showTextView;
private Handler handler;
private CountdownListener countdownListener;
private TextViewGetListener textViewGetListener;
/**
* 创建一个倒计时器
*
* @param showTextView 显示倒计时的文本视图
* @param countdownText 倒计时中显示的内容,例如:"%s秒后重新获取验证码",在倒计时的过程中会用剩余描述替换%s
* @param remainingSeconds 倒计时秒数,例如:60,就是从60开始倒计时一直到0结束
*/
public Countdown (TextView showTextView, String countdownText, int remainingSeconds) {
this .showTextView = showTextView;
this .countdownText = countdownText;
this .remainingSeconds = remainingSeconds;
this .handler = new Handler();
}
/**
* 创建一个倒计时器
*
* @param textViewGetListener 显示倒计时的文本视图获取监听器
* @param countdownText 倒计时中显示的内容,例如:"%s秒后重新获取验证码",在倒计时的过程中会用剩余描述替换%s
* @param remainingSeconds 倒计时秒数,例如:60,就是从60开始倒计时一直到0结束
*/
public Countdown (TextViewGetListener textViewGetListener, String countdownText, int remainingSeconds) {
this .textViewGetListener = textViewGetListener;
this .countdownText = countdownText;
this .remainingSeconds = remainingSeconds;
this .handler = new Handler();
}
/**
* 创建一个倒计时器,默认60秒
*
* @param showTextView 显示倒计时的文本视图
* @param countdownText 倒计时中显示的内容,例如:"%s秒后重新获取验证码",在倒计时的过程中会用剩余描述替换%s
*/
public Countdown (TextView showTextView, String countdownText) {
this (showTextView, countdownText, 60 );
}
/**
* 创建一个倒计时器,默认60秒
*
* @param textViewGetListener 显示倒计时的文本视图获取监听器
* @param countdownText 倒计时中显示的内容,例如:"%s秒后重新获取验证码",在倒计时的过程中会用剩余描述替换%s
*/
public Countdown (TextViewGetListener textViewGetListener, String countdownText) {
this (textViewGetListener, countdownText, 60 );
}
private TextView getShowTextView () {
if (showTextView != null ) {
return showTextView;
}
if (textViewGetListener != null ) {
return textViewGetListener.OnGetShowTextView();
}
return null ;
}
@Override
public void run () {
if (currentRemainingSeconds > 0 ) {
getShowTextView().setEnabled(false );
getShowTextView().setText(
String.format(countdownText, currentRemainingSeconds));
if (countdownListener != null ) {
countdownListener.onUpdate(currentRemainingSeconds);
}
currentRemainingSeconds--;
handler.postDelayed(this , 1000 );
} else {
stop();
}
}
public void start () {
defaultText = (String) getShowTextView().getText().toString();
currentRemainingSeconds = remainingSeconds;
handler.removeCallbacks(this );
handler.post(this );
if (countdownListener != null ) {
countdownListener.onStart();
}
running = true ;
}
public void stop () {
getShowTextView().setEnabled(true );
Spanned htmlStr = Html.fromHtml("<font color=#000000>" +defaultText+"</font>" );
getShowTextView().setText(htmlStr);
handler.removeCallbacks(this );
if (countdownListener != null ) {
countdownListener.onFinish();
}
running = false ;
}
public boolean isRunning () {
return running;
}
public int getRemainingSeconds () {
return remainingSeconds;
}
public String getCountdownText () {
return countdownText;
}
public void setCountdownText (String countdownText) {
this .countdownText = countdownText;
}
public void setCurrentRemainingSeconds (int currentRemainingSeconds) {
this .currentRemainingSeconds = currentRemainingSeconds;
}
public void setCountdownListener (CountdownListener countdownListener) {
this .countdownListener = countdownListener;
}
/**
* 倒计时监听器
*/
public interface CountdownListener {
/**
* 当倒计时开始
*/
public void onStart ();
/**
* 当倒计时结束
*/
public void onFinish ();
/**
* 更新
*
* @param currentRemainingSeconds 剩余时间
*/
public void onUpdate (int currentRemainingSeconds);
}
public interface TextViewGetListener {
public TextView OnGetShowTextView ();
}
}
public class BitmapUtil {
private static String TAG = BitmapUtil.class.getSimpleName();
private static int calculateInSampleSize (BitmapFactory.Options options,
int reqWidth, int reqHeight) {
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1 ;
if (height > reqHeight || width > reqWidth) {
final int halfHeight = height / 2 ;
final int halfWidth = width / 2 ;
while ((halfHeight / inSampleSize) > reqHeight
&& (halfWidth / inSampleSize) > reqWidth) {
inSampleSize *= 2 ;
}
}
return inSampleSize;
}
private static Bitmap createScaleBitmap (Bitmap src, int dstWidth,
int dstHeight) {
Bitmap dst = Bitmap.createScaledBitmap(src, dstWidth, dstHeight, false );
if (src != dst) {
src.recycle();
}
return dst;
}
public static Bitmap decodeSampledBitmap (Resources res, int resId, int reqWidth, int reqHeight) {
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true ;
BitmapFactory.decodeResource(res, resId, options);
options.inSampleSize = calculateInSampleSize(options, reqWidth,
reqHeight);
options.inJustDecodeBounds = false ;
Bitmap src = BitmapFactory.decodeResource(res, resId, options);
return createScaleBitmap(src, reqWidth, reqHeight);
}
public static Bitmap decodeSampledBitmap (Bitmap bitmap, int quality, int reqWidth, int reqHeight) {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, quality, bos);
if (bos != null ) {
try {
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
if (bis != null ) {
try {
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return createScaleBitmap(BitmapFactory.decodeStream(bis), reqWidth, reqHeight);
}
public static Bitmap decodeSampledBitmap (String pathName, int reqWidth, int reqHeight) {
/**
* 设置inJustDecodeBounds为true后,decodeFile并不分配空间,但可计算出原始图片的长度和宽度,
* 即opts.width和opts.height。
* 有了这两个参数,再通过一定的算法,即可得到一个恰当的inSampleSize。
*/
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true ;
BitmapFactory.decodeFile(pathName, options);
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
options.inJustDecodeBounds = false ;
Bitmap src = BitmapFactory.decodeFile(pathName, options);
return createScaleBitmap(src, reqWidth, reqHeight);
}
/**
* 从sd卡上加载图片
*
* @param pathName 文件路径
* @param zoomScale 缩放比例
* 表示缩略图大小为原始图片大小的几分之一,即如果这个值为2,
* 则取出的缩略图的宽和高都是原始图片的1/2,图片大小就为原始大小的1/4
* @return
*/
public static Bitmap decodeSampledBitmap (String pathName, int zoomScale) {
/**
* 设置inJustDecodeBounds为true后,decodeFile并不分配空间,但可计算出原始图片的长度和宽度,
* 即opts.width和opts.height。
* 有了这两个参数,再通过一定的算法,即可得到一个恰当的inSampleSize。
*/
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = zoomScale;
options.inJustDecodeBounds = false ;
Bitmap src = BitmapFactory.decodeFile(pathName, options);
return src;
}
public static void saveBitmapFile (Bitmap bitmap, String filePath, String fileName) {
File f = FileUtil.makeFilePath(filePath, fileName);
FileOutputStream fOut = null ;
try {
fOut = new FileOutputStream(f);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
bitmap.compress(Bitmap.CompressFormat.JPEG, 100 , fOut);
try {
fOut.flush();
} catch (IOException e) {
e.printStackTrace();
}
try {
fOut.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void saveBitmapFile (Bitmap bitmap, File file) {
FileOutputStream fOut = null ;
try {
fOut = new FileOutputStream(file);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
bitmap.compress(Bitmap.CompressFormat.JPEG, 100 , fOut);
try {
fOut.flush();
} catch (IOException e) {
e.printStackTrace();
}
try {
fOut.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 图片旋转
*
* @param bmp 要旋转的图片
* @param degree 图片旋转的角度,负值为逆时针旋转,正值为顺时针旋转
* @return
*/
public static Bitmap rotateBitmap (Bitmap bmp, float degree) {
Matrix matrix = new Matrix();
matrix.postRotate(degree);
return Bitmap.createBitmap(bmp, 0 , 0 , bmp.getWidth(), bmp.getHeight(), matrix, true );
}
public static String bitmapBase64 (Bitmap bitmap) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100 , baos);
byte [] bytes = baos.toByteArray();
return Base64.encodeToString(bytes, 0 );
}
public static Bitmap base64ToBitmap (String iconBase64) {
byte [] bitmapArray;
bitmapArray = Base64.decode(iconBase64, 0 );
return BitmapFactory
.decodeByteArray(bitmapArray, 0 , bitmapArray.length);
}
/**
* 通过图片路径获得bitmap(无压缩形式)
*
* @param path 图片路径
* @return Bitmap
*/
public static Bitmap getBitmapFromLocal (String path) {
Bitmap bitmap = BitmapFactory.decodeFile(path);
return bitmap;
}
/**
* 通过bitmap得到输出流(无压缩形式)
*
* @param bitmap bitmap对象
* @return OutputStream
*/
public static ByteArrayOutputStream getOutStreamFromBitmap (Bitmap bitmap) {
return getOutStreamFromBitmap(bitmap, 100 );
}
/**
* 通过bitmap得到输出流(质量压缩)
*
* @param bitmap bitmap对象
* @param quality 要压缩到的质量(0-100)
* @return OutputStream
*/
public static ByteArrayOutputStream getOutStreamFromBitmap (Bitmap bitmap, int quality) {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, quality, bos);
if (bos != null ) {
try {
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return bos;
}
/**
* 通过流获得bitmap
*
* @param os 输出流
* @return Bitmap
*/
public static Bitmap getBitmapFromOutStream (ByteArrayOutputStream os) {
ByteArrayInputStream bis = new ByteArrayInputStream(os.toByteArray());
if (bis != null ) {
try {
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return BitmapFactory.decodeStream(bis);
}
/**
* 通过路径得到图片并对图片进行压缩,并再生成图片(质量压缩)
*
* @param imagePath 图片的路径
* @param savePath 新图片的保存路径
* @param quality 要压缩到的质量
* @return Boolean true 成功false失败
*/
public static boolean writeCompressImage2File (String imagePath, String savePath, int quality) {
if (TextUtils.isEmpty(imagePath)) {
return false ;
}
String path = savePath.substring(0 , savePath.lastIndexOf("/" ));
String filename = savePath.substring(savePath.lastIndexOf("/" ) + 1 , savePath.length());
return writeImage2File(getOutStreamFromBitmap(getBitmapFromLocal(imagePath), quality), path, filename);
}
/**
* 把bitmap写入指定目录下,重新生成图片
*
* @param bitmap bitmap对象
* @param savePath 新图片保存路径
* @param imageName 新图片的名字,会根据时间来命名
* @return Boolean true 成功false失败
*/
public static boolean writeImage2File (Bitmap bitmap, String savePath, String imageName) {
return writeImage2File(getOutStreamFromBitmap(bitmap), savePath, imageName);
}
/**
* 通过输出流,重组图片,并保存带指定目录下
*
* @param bos 图片输入流
* @param savePath 新图片的保存路径
* @param imageName 新图片的名字,字段为空时,会根据时间来命名
* @return Boolean true 成功false失败
*/
public static boolean writeImage2File (ByteArrayOutputStream bos, String savePath, String imageName) {
if (TextUtils.isEmpty(savePath)) {
return false ;
}
File file = new File(savePath);
if (!file.exists()) {
file.mkdirs();
}
FileOutputStream fos;
try {
File f = new File(file, imageName);
fos = new FileOutputStream(f);
fos.write(bos.toByteArray());
fos.flush();
} catch (Exception e) {
e.printStackTrace();
return false ;
}
return true ;
}
public Bitmap ratio (Bitmap image, float pixelW, float pixelH) {
ByteArrayOutputStream os = new ByteArrayOutputStream();
image.compress(Bitmap.CompressFormat.JPEG, 100 , os);
if (os.toByteArray().length / 1024 > 1024 ) {
os.reset();
image.compress(Bitmap.CompressFormat.JPEG, 50 , os);
}
ByteArrayInputStream is = new ByteArrayInputStream(os.toByteArray());
BitmapFactory.Options newOpts = new BitmapFactory.Options();
newOpts.inJustDecodeBounds = true ;
newOpts.inPreferredConfig = Bitmap.Config.RGB_565;
Bitmap bitmap = BitmapFactory.decodeStream(is, null , newOpts);
newOpts.inJustDecodeBounds = false ;
int w = newOpts.outWidth;
int h = newOpts.outHeight;
float hh = pixelH;
float ww = pixelW;
int be = 1 ;
if (w > h && w > ww) {
be = (int ) (newOpts.outWidth / ww);
} else if (w < h && h > hh) {
be = (int ) (newOpts.outHeight / hh);
}
if (be <= 0 ) be = 1 ;
newOpts.inSampleSize = be;
is = new ByteArrayInputStream(os.toByteArray());
bitmap = BitmapFactory.decodeStream(is, null , newOpts);
return bitmap;
}
}