package com.lcjian.library.okhttp.utils;
|
|
import android.graphics.BitmapFactory;
|
import android.util.DisplayMetrics;
|
import android.view.View;
|
import android.view.ViewGroup;
|
import android.widget.ImageView;
|
|
import java.io.InputStream;
|
import java.lang.reflect.Field;
|
|
/**
|
* Created by zhy on 15/11/6.
|
*/
|
public class ImageUtils
|
{
|
/**
|
* 根据InputStream获取图片实际的宽度和高度
|
*
|
* @param imageStream
|
* @return
|
*/
|
public static ImageSize getImageSize(InputStream imageStream)
|
{
|
BitmapFactory.Options options = new BitmapFactory.Options();
|
options.inJustDecodeBounds = true;
|
BitmapFactory.decodeStream(imageStream, null, options);
|
return new ImageSize(options.outWidth, options.outHeight);
|
}
|
|
public static class ImageSize
|
{
|
int width;
|
int height;
|
|
public ImageSize()
|
{
|
}
|
|
public ImageSize(int width, int height)
|
{
|
this.width = width;
|
this.height = height;
|
}
|
|
@Override
|
public String toString()
|
{
|
return "ImageSize{" +
|
"width=" + width +
|
", height=" + height +
|
'}';
|
}
|
}
|
|
public static int calculateInSampleSize(ImageSize srcSize, ImageSize targetSize)
|
{
|
// 源图片的宽度
|
int width = srcSize.width;
|
int height = srcSize.height;
|
int inSampleSize = 1;
|
|
int reqWidth = targetSize.width;
|
int reqHeight = targetSize.height;
|
|
if (width > reqWidth && height > reqHeight)
|
{
|
// 计算出实际宽度和目标宽度的比率
|
int widthRatio = Math.round((float) width / (float) reqWidth);
|
int heightRatio = Math.round((float) height / (float) reqHeight);
|
inSampleSize = Math.max(widthRatio, heightRatio);
|
}
|
return inSampleSize;
|
}
|
|
/**
|
* 根据ImageView获适当的压缩的宽和高
|
*
|
* @param view
|
* @return
|
*/
|
public static ImageSize getImageViewSize(View view)
|
{
|
|
ImageSize imageSize = new ImageSize();
|
|
imageSize.width = getExpectWidth(view);
|
imageSize.height = getExpectHeight(view);
|
|
return imageSize;
|
}
|
|
/**
|
* 根据view获得期望的高度
|
*
|
* @param view
|
* @return
|
*/
|
private static int getExpectHeight(View view)
|
{
|
|
int height = 0;
|
if (view == null) return 0;
|
|
final ViewGroup.LayoutParams params = view.getLayoutParams();
|
//如果是WRAP_CONTENT,此时图片还没加载,getWidth根本无效
|
if (params != null && params.height != ViewGroup.LayoutParams.WRAP_CONTENT)
|
{
|
height = view.getWidth(); // 获得实际的宽度
|
}
|
if (height <= 0 && params != null)
|
{
|
height = params.height; // 获得布局文件中的声明的宽度
|
}
|
|
if (height <= 0)
|
{
|
height = getImageViewFieldValue(view, "mMaxHeight");// 获得设置的最大的宽度
|
}
|
|
//如果宽度还是没有获取到,憋大招,使用屏幕的宽度
|
if (height <= 0)
|
{
|
DisplayMetrics displayMetrics = view.getContext().getResources()
|
.getDisplayMetrics();
|
height = displayMetrics.heightPixels;
|
}
|
|
return height;
|
}
|
|
/**
|
* 根据view获得期望的宽度
|
*
|
* @param view
|
* @return
|
*/
|
private static int getExpectWidth(View view)
|
{
|
int width = 0;
|
if (view == null) return 0;
|
|
final ViewGroup.LayoutParams params = view.getLayoutParams();
|
//如果是WRAP_CONTENT,此时图片还没加载,getWidth根本无效
|
if (params != null && params.width != ViewGroup.LayoutParams.WRAP_CONTENT)
|
{
|
width = view.getWidth(); // 获得实际的宽度
|
}
|
if (width <= 0 && params != null)
|
{
|
width = params.width; // 获得布局文件中的声明的宽度
|
}
|
|
if (width <= 0)
|
|
{
|
width = getImageViewFieldValue(view, "mMaxWidth");// 获得设置的最大的宽度
|
}
|
//如果宽度还是没有获取到,憋大招,使用屏幕的宽度
|
if (width <= 0)
|
|
{
|
DisplayMetrics displayMetrics = view.getContext().getResources()
|
.getDisplayMetrics();
|
width = displayMetrics.widthPixels;
|
}
|
|
return width;
|
}
|
|
/**
|
* 通过反射获取imageview的某个属性值
|
*
|
* @param object
|
* @param fieldName
|
* @return
|
*/
|
private static int getImageViewFieldValue(Object object, String fieldName)
|
{
|
int value = 0;
|
try
|
{
|
Field field = ImageView.class.getDeclaredField(fieldName);
|
field.setAccessible(true);
|
int fieldValue = field.getInt(object);
|
if (fieldValue > 0 && fieldValue < Integer.MAX_VALUE)
|
{
|
value = fieldValue;
|
}
|
} catch (Exception e)
|
{
|
}
|
return value;
|
|
}
|
}
|