bitmapfiles如何高效使用和管理Bitmap

频道:卡片知识 日期: 浏览:0

各位老铁们,大家好,今天由我来为大家分享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;

}

StringfileName=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.VERSION.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";YoumustuseaBitmapfile(.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,本文到此结束,如果可以帮助到大家,还望关注本站哦!

考研复试早

11月中国亚洲股市

apk精简教程

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 931614094@qq.com 举报,一经查实,本站将立刻删除。