bitmapfiles如何高效使用和管理Bitmap
各位老铁们,大家好,今天由我来为大家分享bitmap files,以及如何高效使用和管理Bitmap的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!
本文目录
登陆UC 出现“bitmap image is not valid如何高效使用和管理Bitmap安卓从手机相册获取照片作为头像缓存地址java中getBitmap()什么意思登陆UC 出现“bitmap image is not valid方法1
你用的是星空管理版本吗?如果是的话彻底卸载。
方法2
解决bitmap
image
is
not
valid错误的补丁
该补丁由星空管理论坛发布,能够解决打开UC时出现的"bitmap
image
is
not
valid"错误提
http://ishare.iask.sina.com.cn/cgi-bin/fileid.cgi?fileid=1905873
方法3
每次启动UC提示“bitmap
image
is
not
valid”(数位图像影像无效):找到c:\program
files\sina\UC\face\
里面,删除其中6000--6009.bmp。然后在该文件夹内复制其他图片文件重新命名为6000.bmp--6009.bmp,并将这些文件改为“只读”。
如何高效使用和管理Bitmap一、图片加载流程
首先,我们谈谈加载图片的流程,项目中的该模块处理流程如下:
1.在UI主线程中,从内存缓存中获取图片,找到后返回。找不到进入下一步;
2.在工作线程中,从磁盘缓存中获取图片,找到即返回并更新内存缓存。找不到进入下一步;
3.在工作线程中,从网络中获取图片,找到即返回并同时更新内存缓存和磁盘缓存。找不到显示默认以提示。
二、内存缓存类(PanoMemCache)
这里使用Android提供的LruCache类,该类保存一个强引用来限制内容数量,每当Item被访问的时候,此Item就会移动到队列的头部。当cache已满的时候加入新的item时,在队列尾部的item会被回收。
[java]viewplaincopyprint?
publicclassPanoMemoryCache{
//LinkedHashMap初始容量
privatestaticfinalintINITIAL_CAPACITY=16;
//LinkedHashMap加载因子
privatestaticfinalintLOAD_FACTOR=0.75f;
//LinkedHashMap排序模式
privatestaticfinalbooleanACCESS_ORDER=true;
//软引用缓存
privatestaticLinkedHashMap<String,SoftReference<Bitmap>>mSoftCache;
//硬引用缓存
privatestaticLruCache<String,Bitmap>mLruCache;
publicPanoMemoryCache(){
//获取单个进程可用内存的最大值
//方式一:使用ActivityManager服务(计量单位为M)
/*intmemClass=((ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE)).getMemoryClass();*/
//方式二:使用Runtime类(计量单位为Byte)
finalintmemClass=(int)Runtime.getRuntime().maxMemory();
//设置为可用内存的1/4(按Byte计算)
finalintcacheSize=memClass/4;
mLruCache=newLruCache<String,Bitmap>(cacheSize){
@Override
protectedintsizeOf(Stringkey,Bitmapvalue){
if(value!=null){
//计算存储bitmap所占用的字节数
returnvalue.getRowBytes()*value.getHeight();
}else{
return0;
}
}
@Override
protectedvoidentryRemoved(booleanevicted,Stringkey,BitmapoldValue,BitmapnewValue){
if(oldValue!=null){
//当硬引用缓存容量已满时,会使用LRU算法将最近没有被使用的图片转入软引用缓存
mSoftCache.put(key,newSoftReference<Bitmap>(oldValue));
}
}
};
/*
*第一个参数:初始容量(默认16)
*第二个参数:加载因子(默认0.75)
*第三个参数:排序模式(true:按访问次数排序;false:按插入顺序排序)
*/
mSoftCache=newLinkedHashMap<String,SoftReference<Bitmap>>(INITIAL_CAPACITY,LOAD_FACTOR,ACCESS_ORDER){
privatestaticfinallongserialVersionUID=7237325113220820312L;
@Override
protectedbooleanremoveEldestEntry(Entry<String,SoftReference<Bitmap>>eldest){
if(size()>SOFT_CACHE_SIZE){
returntrue;
}
returnfalse;
}
};
}
/**
*从缓存中获取Bitmap
*@paramurl
*@returnbitmap
*/
publicBitmapgetBitmapFromMem(Stringurl){
Bitmapbitmap=null;
//先从硬引用缓存中获取
synchronized(mLruCache){
bitmap=mLruCache.get(url);
if(bitmap!=null){
//找到该Bitmap之后,将其移到LinkedHashMap的最前面,保证它在LRU算法中将被最后删除。
mLruCache.remove(url);
mLruCache.put(url,bitmap);
returnbitmap;
}
}
//再从软引用缓存中获取
synchronized(mSoftCache){
SoftReference<Bitmap>bitmapReference=mSoftCache.get(url);
if(bitmapReference!=null){
bitmap=bitmapReference.get();
if(bitmap!=null){
//找到该Bitmap之后,将它移到硬引用缓存。并从软引用缓存中删除。
mLruCache.put(url,bitmap);
mSoftCache.remove(url);
returnbitmap;
}else{
mSoftCache.remove(url);
}
}
}
returnnull;
}
/**
*添加Bitmap到内存缓存
*@paramurl
*@parambitmap
*/
publicvoidaddBitmapToCache(Stringurl,Bitmapbitmap){
if(bitmap!=null){
synchronized(mLruCache){
mLruCache.put(url,bitmap);
}
}
}
/**
*清理软引用缓存
*/
publicvoidclearCache(){
mSoftCache.clear();
mSoftCache=null;
}
}
补充一点,由于4.0平台以后对SoftReference类引用的对象调整了回收策略,所以该类中的软引用缓存实际上没什么效果,可以去掉。2.3以前平台建议保留。
三、磁盘缓存类(PanoDiskCache)
[java]viewplaincopyprint?
publicclassPanoDiskCache{
privatestaticfinalStringTAG="PanoDiskCache";
//文件缓存目录
privatestaticfinalStringCACHE_DIR="panoCache";
privatestaticfinalStringCACHE_FILE_SUFFIX=".cache";
privatestaticfinalintMB=1024*1024;
privatestaticfinalintCACHE_SIZE=10;//10M
privatestaticfinalintSDCARD_CACHE_THRESHOLD=10;
publicPanoDiskCache(){
//清理文件缓存
removeCache(getDiskCacheDir());
}
/**
*从磁盘缓存中获取Bitmap
*@paramurl
*@return
*/
publicBitmapgetBitmapFromDisk(Stringurl){
Stringpath=getDiskCacheDir()+File.separator+genCacheFileName(url);
Filefile=newFile(path);
if(file.exists()){
Bitmapbitmap=BitmapFactory.decodeFile(path);
if(bitmap==null){
file.delete();
}else{
updateLastModified(path);
returnbitmap;
}
}
returnnull;
}
/**
*将Bitmap写入文件缓存
*@parambitmap
*@paramurl
*/
publicvoidaddBitmapToCache(Bitmapbitmap,Stringurl){
if(bitmap==null){
return;
}
//判断当前SDCard上的剩余空间是否足够用于文件缓存
if(SDCARD_CACHE_THRESHOLD>calculateFreeSpaceOnSd()){
return;
}
Stringfi
leName=genCacheFileName(url);Stringdir=getDiskCacheDir();
FiledirFile=newFile(dir);
if(!dirFile.exists()){
dirFile.mkdirs();
}
Filefile=newFile(dir+File.separator+fileName);
try{
file.createNewFile();
FileOutputStreamout=newFileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.JPEG,100,out);
out.flush();
out.close();
}catch(FileNotFoundExceptione){
Log.e(TAG,"FileNotFoundException");
}catch(IOExceptione){
Log.e(TAG,"IOException");
}
}
/**
*清理文件缓存
*当缓存文件总容量超过CACHE_SIZE或SDCard的剩余空间小于SDCARD_CACHE_THRESHOLD时,将删除40%最近没有被使用的文件
*@paramdirPath
*@return
*/
privatebooleanremoveCache(StringdirPath){
Filedir=newFile(dirPath);
File[]files=dir.listFiles();
if(files==null||files.length==0){
returntrue;
}
if(!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
returnfalse;
}
intdirSize=0;
for(inti=0;i<files.length;i++){
if(files[i].getName().contains(CACHE_FILE_SUFFIX)){
dirSize+=files[i].length();
}
}
if(dirSize>CACHE_SIZE*MB||SDCARD_CACHE_THRESHOLD>calculateFreeSpaceOnSd()){
intremoveFactor=(int)(0.4*files.length+1);
Arrays.sort(files,newFileLastModifiedSort());
for(inti=0;i<removeFactor;i++){
if(files[i].getName().contains(CACHE_FILE_SUFFIX)){
files[i].delete();
}
}
}
if(calculateFreeSpaceOnSd()<=SDCARD_CACHE_THRESHOLD){
returnfalse;
}
returntrue;
}
/**
*更新文件的最后修改时间
*@parampath
*/
privatevoidupdateLastModified(Stringpath){
Filefile=newFile(path);
longtime=System.currentTimeMillis();
file.setLastModified(time);
}
/**
*计算SDCard上的剩余空间
*@return
*/
privateintcalculateFreeSpaceOnSd(){
StatFsstat=newStatFs(Environment.getExternalStorageDirectory().getPath());
doublesdFreeMB=((double)stat.getAvailableBlocks()*(double)stat.getBlockSize())/MB;
return(int)sdFreeMB;
}
/**
*生成统一的磁盘文件后缀便于维护
*从URL中得到源文件名称,并为它追加缓存后缀名.cache
*@paramurl
*@return文件存储后的名称
*/
privateStringgenCacheFileName(Stringurl){
String[]strs=url.split(File.separator);
returnstrs[strs.length-1]+CACHE_FILE_SUFFIX;
}
/**
*获取磁盘缓存目录
*@return
*/
privateStringgetDiskCacheDir(){
returngetSDPath()+File.separator+CACHE_DIR;
}
/**
*获取SDCard目录
*@return
*/
privateStringgetSDPath(){
FilesdDir=null;
//判断SDCard是否存在
booleansdCardExist=Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);
if(sdCardExist){
//获取SDCard根目录
sdDir=Environment.getExternalStorageDirectory();
}
if(sdDir!=null){
returnsdDir.toString();
}else{
return"";
}
}
/**
*根据文件最后修改时间进行排序
*/
privateclassFileLastModifiedSortimplementsComparator<File>{
@Override
publicintcompare(Filelhs,Filerhs){
if(lhs.lastModified()>rhs.lastModified()){
return1;
}elseif(lhs.lastModified()==rhs.lastModified()){
return0;
}else{
return-1;
}
}
}
}
安卓从手机相册获取照片作为头像缓存地址*1、实现原理:用户打开相册或相机选择相片后,相片经过压缩并设置在控件上,图片在本地sd卡存一份(如果有的话,没有则内部存储,所以还
*需要判断用户是否挂载了sd卡),然后在服务器上存储一份该图片,当下次再次启动应用时,会默认去sd卡加载该图片,如果本地没有,再会去联网请求
*2、使用了picasso框架以及自定义BitmapUtils工具类
*3、记得加上相关权限
*<uses-permissionandroid:name="android.permission.INTERNET"></uses-permission>
<uses-permissionandroid:name="android.permission.CAMERA"/>
<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
**/
publicclassMainActivityextendsAppCompatActivityimplementsView.OnClickListener{
privateImageViewiv;//要设置的头像
privateButtonbtn_photo;//调用相册按钮
privateButtonbtn_camera;//调用相机按钮
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv=(ImageView)findViewById(R.id.iv);
btn_photo=(Button)findViewById(R.id.btn_photo);
btn_camera=(Button)findViewById(R.id.btn_camera);
btn_photo.setOnClickListener(this);
btn_camera.setOnClickListener(this);
}
@Override
publicvoidonClick(Viewv){
switch(v.getId()){
caseR.id.btn_photo://打开系统相册
Intentintent=newIntent(Intent.ACTION_PICK,MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent,100);
break;
caseR.id.btn_camera://打开系统相机
Intentintent2=newIntent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent2,200);
break;
}
}
@RequiresApi(api=Build.VERSION_CODES.KITKAT)
@Override
protectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){
super.onActivityResult(requestCode,resultCode,data);
if(requestCode==100&&resultCode==RESULT_OK&&data!=null){//系统相册
UriimageData=data.getData();
Stringpath=getPath(imageData);
Bitmapbitmap=BitmapFactory.decodeFile(path);
Bitmapbitmap1=BitmapUtils.zoom(bitmap,iv.getWidth(),iv.getHeight());
Bitmapbitmap2=BitmapUtils.circleBitmap(bitmap1);
//加载显示
iv.setImageBitmap(bitmap2);
//bitmap图片上传到服务器......
//bitmap图片保存到本地
saveImage(bitmap2);
}elseif(requestCode==200&&resultCode==RESULT_OK&&data!=null){//系统相机
Bitmapbitmap=(Bitmap)data.getExtras().get("data");
BitmapUtils.zoom(bitmap,iv.getWidth(),iv.getHeight());
bitmap=BitmapUtils.circleBitmap(bitmap);
//加载显示
iv.setImageBitmap(bitmap);
//bitmap图片上传到服务器......
//bitmap图片保存到本地
saveImage(bitmap);
}
}
/**
*数据的存储。(5种)
*Bimap:内存层面的图片对象。
*
*存储--->内存:
*BitmapFactory.decodeFile(StringfilePath);
*BitmapFactory.decodeStream(InputStreamis);
*内存--->存储:
*bitmap.compress(Bitmap.CompressFormat.PNG,100,OutputStreamos);
*/
privatevoidsaveImage(Bitmapbitmap){
FilefilesDir;
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){//判断sd卡是否挂载
//路径1:storage/sdcard/Android/data/包名/files
filesDir=this.getExternalFilesDir("");
}else{//手机内部存储
//路径:data/data/包名/files
filesDir=this.getFilesDir();
}
FileOutputStreamfos=null;
try{
Filefile=newFile(filesDir,"icon.png");
fos=newFileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.PNG,100,fos);
}catch(FileNotFoundExceptione){
e.printStackTrace();
}finally{
if(fos!=null){
try{
fos.close();
}catch(IOExceptione){
e.printStackTrace();
}
}
}
}
//如果本地有,就不需要再去联网去请求
privatebooleanreadImage(){
FilefilesDir;
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){//判断sd卡是否挂载
//路径1:storage/sdcard/Android/data/包名/files
filesDir=getExternalFilesDir("");
}else{//手机内部存储
//路径:data/data/包名/files
filesDir=getFilesDir();
}
Filefile=newFile(filesDir,"icon.png");
if(file.exists()){
//存储--->内存
Bitmapbitmap=BitmapFactory.decodeFile(file.getAbsolutePath());
iv.setImageBitmap(bitmap);
returntrue;
}
returnfalse;
}
@RequiresApi(api=Build.VERSION_CODES.KITKAT)
privateStringgetPath(Uriuri){
intsdkVersion=Build.VE
RSION.SDK_INT;//高于4.4.2的版本
if(sdkVersion>=19){
Log.e("TAG","uriauth:"+uri.getAuthority());
if(isExternalStorageDocument(uri)){
StringdocId=DocumentsContract.getDocumentId(uri);
String[]split=docId.split(":");
Stringtype=split[0];
if("primary".equalsIgnoreCase(type)){
returnEnvironment.getExternalStorageDirectory()+"/"+split[1];
}
}elseif(isDownloadsDocument(uri)){
finalStringid=DocumentsContract.getDocumentId(uri);
finalUricontentUri=ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"),
Long.valueOf(id));
returngetDataColumn(this,contentUri,null,null);
}elseif(isMediaDocument(uri)){
finalStringdocId=DocumentsContract.getDocumentId(uri);
finalString[]split=docId.split(":");
finalStringtype=split[0];
UricontentUri=null;
if("image".equals(type)){
contentUri=MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
}elseif("video".equals(type)){
contentUri=MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
}elseif("audio".equals(type)){
contentUri=MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
}
finalStringselection="_id=?";
finalString[]selectionArgs=newString[]{split[1]};
returngetDataColumn(this,contentUri,selection,selectionArgs);
}elseif(isMedia(uri)){
String[]proj={MediaStore.Images.Media.DATA};
Cursoractualimagecursor=this.managedQuery(uri,proj,null,null,null);
intactual_image_column_index=actualimagecursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
actualimagecursor.moveToFirst();
returnactualimagecursor.getString(actual_image_column_index);
}
}elseif("content".equalsIgnoreCase(uri.getScheme())){
//Returntheremoteaddress
if(isGooglePhotosUri(uri))
returnuri.getLastPathSegment();
returngetDataColumn(this,uri,null,null);
}
//File
elseif("file".equalsIgnoreCase(uri.getScheme())){
returnuri.getPath();
}
returnnull;
}
/**
*uri路径查询字段
*
*@paramcontext
*@paramuri
*@paramselection
*@paramselectionArgs
*@return
*/
publicstaticStringgetDataColumn(Contextcontext,Uriuri,Stringselection,String[]selectionArgs){
Cursorcursor=null;
finalStringcolumn="_data";
finalString[]projection={column};
try{
cursor=context.getContentResolver().query(uri,projection,selection,selectionArgs,null);
if(cursor!=null&&cursor.moveToFirst()){
finalintindex=cursor.getColumnIndexOrThrow(column);
returncursor.getString(index);
}
}finally{
if(cursor!=null)
cursor.close();
}
returnnull;
}
privatebooleanisExternalStorageDocument(Uriuri){
return"com.android.externalstorage.documents".equals(uri.getAuthority());
}
publicstaticbooleanisDownloadsDocument(Uriuri){
return"com.android.providers.downloads.documents".equals(uri.getAuthority());
}
publicstaticbooleanisMediaDocument(Uriuri){
return"com.android.providers.media.documents".equals(uri.getAuthority());
}
publicstaticbooleanisMedia(Uriuri){
return"media".equals(uri.getAuthority());
}
/**
*@paramuriTheUritocheck.
*@returnWhethertheUriauthorityisGooglePhotos.
*/
publicstaticbooleanisGooglePhotosUri(Uriuri){
return"com.google.android.apps.photos.content".equals(uri.getAuthority());
}
/**
*判断本地是否有该图片,没有则去联网请求
**/
@Override
protectedvoidonResume(){
super.onResume();
if(readImage()){
return;
}
}
}
//BitmapUtils工具类publicclassBitmapUtils{/**
*该方法用于将图片进行圆形处理
**/publicstaticBitmapcircleBitmap(Bitmapsource){//默认只对宽进行处理intwidth=source.getWidth();Bitmapbitmap=Bitmap.createBitmap(width,width,Bitmap.Config.ARGB_8888);Canvascanvas=newCanvas(bitmap);Paintpaint=newPaint();//设置抗锯齿paint.setAntiAlias(true);canvas.drawCircle(width/2,width/2,width/2,paint);paint.setXfermode(newPorterDuffXfermode(PorterDuff.Mode.SRC_IN));canvas.drawBitmap(source,0,0,paint);returnbitmap;}/***该方法用于图片压缩处理,注意width、height参数的类型必须是float**/publicstaticBitmapzoom(Bitmapsource,floatwidth,floatheight){Matrixmatrix=newMatrix();//图片进行压缩处理matrix.postScale(width/source.getWidth(),height/source.getHeight());Bitmapbitmap=Bitmap.createBitmap(source,0,0,source.getWidth(),source.getHeight(),matrix,false);returnbitmap;}}
以上所述是小编给大家介绍的Android实现调用系统图库与相机设置头像并保存在本地及服务器,希望对大家有所帮助
java中getBitmap()什么意思给你个连接自己看看http://resources.esri.com/help/9.3/arcgisengine/java/api/arcobjects/com/esri/arcgis/controls/ControlsGlobeLayerListToolControl.html#getBitmap()
下面是详细信息:
publicintgetBitmap()
throwsIOException,
AutomationExceptionThebitmapthatisusedastheicononthiscommand.
Remarks
WhenimplementingICommandtocreateacustomcommand,usetheBitmappropertytosetthebitmaptobeusedastheicononthiscommand.InyourVisualBasicprojectforthiscommand,thebitmapcanbestoredinaresourcefileorinaPictureBoxcontrolonaform.
YoumustuseaBitmapfile(.bmp)fortheBitmapproperty;Iconfiles(.ico)arenotsupported.Bitmapfilesshouldbe16X16pixels.Thecoloroftheupperleftpixelofthebitmapistreatedasthetransparentcolor.Forexample,iftheupperleftpixelofthebitmapisred,thenalloftheredpixelsinthebitmapwillbeconvertedtotransparent.
Whenacommandisputonatoolbar,thecommandisdisplayedwiththebitmaponlybydefault;thedisplaytypeissettoImageOnly(ICommandItem::Style=esriCommandStyleIconOnly).Whenacommandisputonamenu,thecommandisdisplayedwiththebitmapandcaptionbydefault;thedisplaytypeissettoImageandText(ICommandItem::Style=esriCommandStyleIconAndText).However,iftheBitmappropertyisnotsetforthiscommand,thenthecommandwillbedisplayedwiththecaptiononlybydefaultwhenitisputonatoolbarormenu;thedisplaytypeissettoTextOnly(ICommandItem::Style=esriCommandStyleTextOnly).
ProductAvailability
AvailablewithArcGISEngine,ArcGISDesktop,andArcGISServer.
SupportedPlatforms
Windows,Solaris,Linux
WhenimplementingICommandtocreateacustomcommand,thereisnoneedtoimplementthismethod.InthecustomJavaCommandclass,setthebitmapPathStringtothephysicallocationofthebitmapfiletobeusedonthetoolbar.
bitmapPath="/images/mybitmap.bmp";YoumustuseaBitma
pfile(.bmp);Iconfiles(.ico)arenotsupported.Bitmapfilesshouldbe16X16pixels.Thecoloroftheupperleftpixelofthebitmapistreatedasthetransparentcolor.Forexample,iftheupperleftpixelofthebitmapisred,thenalloftheredpixelsinthebitmapwillbeconvertedtotransparent.Whenacommandisputonatoolbar,thecommandisdisplayedwiththebitmaponlybydefault;thedisplaytypeissettoImageOnly(esriCommandStyles.esriCommandStyleIconOnly).Whenacommandisputonamenu,thecommandisdisplayedwiththebitmapandcaptionbydefault;thedisplaytypeissettoImageandText(esriCommandStyles.esriCommandStyleIconAndText).However,iftheBitmappropertyisnotsetforthiscommand,thenthecommandwillbedisplayedwiththecaptiononlybydefaultwhenitisputonatoolbarormenu;thedisplaytypeissettoTextOnly(esriCommandStyles.esriCommandStyleTextOnly).
Specifiedby:
getBitmapininterfaceICommand
Returns:
Thebitmap(ACOMtypedef)
Throws:
IOException-Ifthereareinteropproblems.
AutomationException-IftheArcObjectcomponentthrowsanexception.
END,本文到此结束,如果可以帮助到大家,还望关注本站哦!