Universal-imageLoader缓存图片加载

2024-04-26 12:08

本文主要是介绍Universal-imageLoader缓存图片加载,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一,先要配置ImageLoaderConfiguration这个类实现全局ImageLoader的实现情况

ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(this).memoryCacheExtraOptions(480, 800)// max width, max height,即保存的每个缓存文件的最大长宽.discCacheExtraOptions(480, 800, null)//Can slow ImageLoader, use it carefully (Better don't use// it)/设置缓存的详细信息,最好不要设置这个.threadPoolSize(3)// 线程池内加载的数量.threadPriority(Thread.NORM_PRIORITY - 2).denyCacheImageMultipleSizesInMemory().memoryCache(new UsingFreqLimitedMemoryCache(2 * 1024 * 1024))// You can pass your own memory cache// implementation/你可以通过自己的内存缓存实现.memoryCacheSize(2 * 1024 * 1024)//内存大小.discCacheSize(50 * 1024 * 1024)//硬盘大小.discCacheFileNameGenerator(new Md5FileNameGenerator())// 将保存的时候的URI名称用MD5 加密.tasksProcessingOrder(QueueProcessingType.LIFO).discCacheFileCount(100) // 缓存的文件数量  .discCache(new UnlimitedDiscCache(new File(Environment.getExternalStorageDirectory()+ "/myApp/imgCache")))  // 自定义缓存路径	  .defaultDisplayImageOptions(getDisplayOptions()).imageDownloader(new BaseImageDownloader(this, 5 * 1000, 30 * 1000)).writeDebugLogs() // Remove for release app.build();// 开始构建ImageLoader.getInstance().init(config);//全局初始化此配置<span style="margin: 0px; padding: 0px; border: currentcolor; font-family: Consolas, 'Courier New', Courier, mono, serif; line-height: 18px; background-color: inherit;"> </span>

二,使用ImageLoader进行图片加载的时候,先要实例化ImageLoader

protected ImageLoader imageLoader = ImageLoader.getInstance(); 
之后进行显示的图片的各种格式DisplayImageOptions 的设置

DisplayImageOptions options;options = new DisplayImageOptions.Builder().showImageOnLoading(R.drawable.ic_launcher)// 设置图片在下载期间显示的图片.showImageForEmptyUri(R.drawable.ic_launcher)// 设置图片Uri为空或是错误的时候显示的图片.showImageOnFail(R.drawable.ic_launcher) // 设置图片加载/解码过程中错误时候显示的图片.cacheInMemory(true)// 设置下载的图片是否缓存在内存中.cacheOnDisc(true)// 设置下载的图片是否缓存在SD卡中.considerExifParams(true) // 是否考虑JPEG图像EXIF参数(旋转,翻转).imageScaleType(ImageScaleType.EXACTLY_STRETCHED)// 设置图片以如何的编码方式显示.bitmapConfig(Bitmap.Config.RGB_565)// 设置图片的解码类型//// .delayBeforeLoading(int delayInMillis)//int// delayInMillis为你设置的下载前的延迟时间// 设置图片加入缓存前,对bitmap进行设置// .preProcessor(BitmapProcessor preProcessor).resetViewBeforeLoading(true)// 设置图片在下载前是否重置,复位.displayer(new RoundedBitmapDisplayer(20))// 是否设置为圆角,弧度为多少.displayer(new FadeInBitmapDisplayer(100))// 是否图片加载好后渐入的动画时间.build();// 构建完成

按照你所需要的配置去设置,如果不需要的就可以不做配置。

三,三者的关系

ImageLoaderConfiguration是针对图片缓存的全局配置,主要有线程类、缓存大小、磁盘大小、图片下载与解析、日志方面的配置。

ImageLoader是具体下载图片,缓存图片,显示图片的具体执行类,它有两个具体的方法displayImage(...)、loadImage(...),但是其实最终他们的实现都是displayImage(...)。

DisplayImageOptions用于指导1,每一个Imageloader根据网络图片的状态(空白、下载错误、正在下载)显示对应的图片,2,是否将缓存加载到磁盘上,下载完后对图片进行怎么样的处理。

从三者的协作关系上看,他们有点像厨房规定、厨师、客户个人口味之间的关系。ImageLoaderConfiguration就像是厨房里面的规定,每一个厨师要怎么着装,要怎么保持厨房的干净,这是针对每一个厨师都适用的规定,而且不允许个性化改变。ImageLoader就像是具体做菜的厨师,负责具体菜谱的制作。DisplayImageOptions就像每个客户的偏好,根据客户是重口味还是清淡,每一个imageLoader根据DisplayImageOptions的要求具体执行。

1.纯粹为了加载默认配置的一个图片的

ImageLoader.getInstance().displayImage(imageUrl, imageView); // imageUrl代表图片的URL地址,imageView代表承载图片的IMAGEVIEW控件 

import java.io.File;import android.app.Application;
import android.graphics.Bitmap;
import android.os.Environment;import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiscCache;
import com.nostra13.universalimageloader.cache.disc.naming.Md5FileNameGenerator;
import com.nostra13.universalimageloader.cache.memory.impl.UsingFreqLimitedMemoryCache;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.assist.ImageScaleType;
import com.nostra13.universalimageloader.core.assist.QueueProcessingType;
import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer;
import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer;
import com.nostra13.universalimageloader.core.download.BaseImageDownloader;public class MyApplication extends Application {@Overridepublic void onCreate() {// TODO Auto-generated method stubsuper.onCreate();ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(this).memoryCacheExtraOptions(480, 800)// max width, max height,即保存的每个缓存文件的最大长宽.discCacheExtraOptions(480, 800, null)//Can slow ImageLoader, use it carefully (Better don't use// it)/设置缓存的详细信息,最好不要设置这个.threadPoolSize(3)// 线程池内加载的数量.threadPriority(Thread.NORM_PRIORITY - 2).denyCacheImageMultipleSizesInMemory().memoryCache(new UsingFreqLimitedMemoryCache(2 * 1024 * 1024))// You can pass your own memory cache// implementation/你可以通过自己的内存缓存实现.memoryCacheSize(2 * 1024 * 1024)//内存大小.discCacheSize(50 * 1024 * 1024)//硬盘大小.discCacheFileNameGenerator(new Md5FileNameGenerator())// 将保存的时候的URI名称用MD5 加密.tasksProcessingOrder(QueueProcessingType.LIFO).discCacheFileCount(100) // 缓存的文件数量  .discCache(new UnlimitedDiscCache(new File(Environment.getExternalStorageDirectory()+ "/myApp/imgCache")))  // 自定义缓存路径	  .defaultDisplayImageOptions(getDisplayOptions()).imageDownloader(new BaseImageDownloader(this, 5 * 1000, 30 * 1000)).writeDebugLogs() // Remove for release app.build();// 开始构建//全局初始化此配置 ImageLoader.getInstance().init(config);}private DisplayImageOptions getDisplayOptions() {DisplayImageOptions options;options = new DisplayImageOptions.Builder().showImageOnLoading(R.drawable.ic_launcher)// 设置图片在下载期间显示的图片.showImageForEmptyUri(R.drawable.ic_launcher)// 设置图片Uri为空或是错误的时候显示的图片.showImageOnFail(R.drawable.ic_launcher) // 设置图片加载/解码过程中错误时候显示的图片.cacheInMemory(true)// 设置下载的图片是否缓存在内存中.cacheOnDisc(true)// 设置下载的图片是否缓存在SD卡中.considerExifParams(true) // 是否考虑JPEG图像EXIF参数(旋转,翻转).imageScaleType(ImageScaleType.EXACTLY_STRETCHED)// 设置图片以如何的编码方式显示.bitmapConfig(Bitmap.Config.RGB_565)// 设置图片的解码类型//// .delayBeforeLoading(int delayInMillis)//int// delayInMillis为你设置的下载前的延迟时间// 设置图片加入缓存前,对bitmap进行设置// .preProcessor(BitmapProcessor preProcessor).resetViewBeforeLoading(true)// 设置图片在下载前是否重置,复位.displayer(new RoundedBitmapDisplayer(20))// 是否设置为圆角,弧度为多少.displayer(new FadeInBitmapDisplayer(100))// 是否图片加载好后渐入的动画时间.build();// 构建完成return options;}
}
public class MainActivity extends Activity {private ImageLoader loader;private ImageView iv_img;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);loader = ImageLoader.getInstance();iv_img = (ImageView) this.findViewById(R.id.iv_img);String uri = "file:///" + "本地路径";
//		loader.displayImage(
//				"http://s1.jikexueyuan.com/current/static/images/logo.png",
//				iv_img);loader.displayImage("http://s1.jikexueyuan.com/current/static/images/logo.png",iv_img, new ImageLoadingListener() {@Overridepublic void onLoadingStarted(String arg0, View arg1) {Log.i("info", "onLoadingStarted");}@Overridepublic void onLoadingFailed(String arg0, View arg1,FailReason arg2) {Log.i("info", "onLoadingFailed");}@Overridepublic void onLoadingComplete(String arg0, View arg1,Bitmap arg2) {Log.i("info", "onLoadingComplete");}@Overridepublic void onLoadingCancelled(String arg0, View arg1) {Log.i("info", "onLoadingCancelled");}});}

2.加载自定义配置的一个图片的

ImageLoader.getInstance().displayImage(imageUrl, imageView,options); // imageUrl代表图片的URL地址,imageView代表承载图片的IMAGEVIEW控件 , options代表DisplayImageOptions配置文件 
		options = new DisplayImageOptions.Builder().showImageOnLoading(R.drawable.ic_stub) // 设置图片下载期间显示的图片.showImageForEmptyUri(R.drawable.ic_empty) // 设置图片Uri为空或是错误的时候显示的图片.showImageOnFail(R.drawable.ic_error) // 设置图片加载或解码过程中发生错误显示的图片.cacheInMemory(true) // 设置下载的图片是否缓存在内存中.cacheOnDisk(true) // 设置下载的图片是否缓存在SD卡中.displayer(new RoundedBitmapDisplayer(20)) // 设置成圆角图片.build();

3.图片加载时候带加载情况的监听

imageLoader.displayImage(imageUrl, imageView, options, new ImageLoadingListener() {  @Override  public void onLoadingStarted() {  //开始加载的时候执行  }  @Override  public void onLoadingFailed(FailReason failReason) {        //加载失败的时候执行  }   @Override   public void onLoadingComplete(Bitmap loadedImage) {  //加载成功的时候执行  }   @Override   public void onLoadingCancelled() {  //加载取消的时候执行  }});  


四,ListView和GridView中的图片缓存

BaseActivity.java

package com.xwj.imageloaderdemo;import com.nostra13.universalimageloader.core.ImageLoader;import android.app.Activity;
import android.os.Bundle;public abstract class BaseActivity extends Activity {protected ImageLoader imageLoader;/*** 初始化布局资源文件*/public abstract int initResource();/*** 初始化组件*/public abstract void initComponent();/*** 初始化数据*/public abstract void initData();/*** 添加监听*/public abstract void addListener();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(initResource());imageLoader = ImageLoader.getInstance();initComponent();initData();addListener();}}
ImageGridActivity.java

package com.xwj.imageloaderdemo;import android.R.integer;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer;
import com.xwj.util.Constants;public class ImageGridActivity extends BaseActivity{private GridView mGridGv;private DisplayImageOptions options;	// 设置图片显示相关参数private String[] imageUrls;		// 图片路径@Overridepublic int initResource() {return R.layout.activity_gridview;}@Overridepublic void initComponent() {mGridGv = (GridView) findViewById(R.id.gv_image);}@Overridepublic void initData() {Bundle bundle = getIntent().getExtras();imageUrls = bundle.getStringArray(Constants.IMAGES);options = new DisplayImageOptions.Builder().showImageOnLoading(R.drawable.ic_stub) // 设置图片下载期间显示的图片.showImageForEmptyUri(R.drawable.ic_empty) // 设置图片Uri为空或是错误的时候显示的图片.showImageOnFail(R.drawable.ic_error) // 设置图片加载或解码过程中发生错误显示的图片.cacheInMemory(true) // 设置下载的图片是否缓存在内存中.cacheOnDisk(true) // 设置下载的图片是否缓存在SD卡中.displayer(new RoundedBitmapDisplayer(20)) // 设置成圆角图片.build();mGridGv.setAdapter(new ItemGridAdapter());}@Overridepublic void addListener() {mGridGv.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view,int position, long id) {}});}class ItemGridAdapter extends BaseAdapter{@Overridepublic int getCount() {return imageUrls.length;}@Overridepublic Object getItem(int position) {return imageUrls[position];}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder viewHolder = null;if (convertView == null) {viewHolder = new ViewHolder();convertView = getLayoutInflater().inflate(R.layout.item_grid, parent, false);viewHolder.image = (ImageView) convertView.findViewById(R.id.iv_grid_image);convertView.setTag(viewHolder);} else {viewHolder = (ViewHolder) convertView.getTag();}imageLoader.displayImage(imageUrls[position], viewHolder.image, options);return convertView;}public class ViewHolder {public ImageView image;}}}

ImageListActivity.java

package com.xwj.imageloaderdemo;import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer;
import com.xwj.util.Constants;public class ImageListActivity extends BaseActivity {private ListView mListImageLv;private DisplayImageOptions options; // 设置图片显示相关参数private String[] imageUrls; // 图片路径@Overridepublic int initResource() {return R.layout.activity_list;}@Overridepublic void initComponent() {mListImageLv = (ListView) findViewById(R.id.lv_image);}@Overridepublic void initData() {Bundle bundle = getIntent().getExtras();imageUrls = bundle.getStringArray(Constants.IMAGES);// 使用DisplayImageOptions.Builder()创建DisplayImageOptionsoptions = new DisplayImageOptions.Builder().showImageOnLoading(R.drawable.ic_stub) // 设置图片下载期间显示的图片.showImageForEmptyUri(R.drawable.ic_empty) // 设置图片Uri为空或是错误的时候显示的图片.showImageOnFail(R.drawable.ic_error) // 设置图片加载或解码过程中发生错误显示的图片.cacheInMemory(true) // 设置下载的图片是否缓存在内存中.cacheOnDisk(true) // 设置下载的图片是否缓存在SD卡中.displayer(new RoundedBitmapDisplayer(20)) // 设置成圆角图片.build(); // 构建完成mListImageLv.setAdapter(new ItemListAdapter());}@Overridepublic void addListener() {}class ItemListAdapter extends BaseAdapter {@Overridepublic int getCount() {return imageUrls.length;}@Overridepublic Object getItem(int position) {return imageUrls[position];}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder viewHolder = null;if (convertView == null) {convertView = getLayoutInflater().inflate(R.layout.item_list,null);viewHolder = new ViewHolder();viewHolder.image = (ImageView) convertView.findViewById(R.id.iv_image);viewHolder.text = (TextView) convertView.findViewById(R.id.tv_introduce);convertView.setTag(viewHolder);} else {viewHolder = (ViewHolder) convertView.getTag();}/*** imageUrl 图片的Url地址 imageView 承载图片的ImageView控件 options* DisplayImageOptions配置文件*/imageLoader.displayImage(imageUrls[position],viewHolder.image, options);viewHolder.text.setText("Item " + (position + 1)); // TextView设置文本return convertView;}public class ViewHolder {public ImageView image;public TextView text;}}}
ImageLoaderApplication.java

package com.xwj.imageloaderdemo;import java.io.File;import android.app.Application;
import android.content.Context;import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiscCache;
import com.nostra13.universalimageloader.cache.disc.naming.Md5FileNameGenerator;
import com.nostra13.universalimageloader.cache.memory.impl.UsingFreqLimitedMemoryCache;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.assist.QueueProcessingType;
import com.nostra13.universalimageloader.core.download.BaseImageDownloader;
import com.nostra13.universalimageloader.utils.StorageUtils;public class ImageLoaderApplication extends Application {public void onCreate() {super.onCreate();initImageLoader(getApplicationContext());}public static void initImageLoader(Context context) {//缓存文件的目录File cacheDir = StorageUtils.getOwnCacheDirectory(context, "imageloader/Cache"); ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context).memoryCacheExtraOptions(480, 800) // max width, max height,即保存的每个缓存文件的最大长宽 .threadPoolSize(3) //线程池内加载的数量.threadPriority(Thread.NORM_PRIORITY - 2).denyCacheImageMultipleSizesInMemory().diskCacheFileNameGenerator(new Md5FileNameGenerator()) //将保存的时候的URI名称用MD5 加密.memoryCache(new UsingFreqLimitedMemoryCache(2 * 1024 * 1024)) // You can pass your own memory cache implementation/你可以通过自己的内存缓存实现.memoryCacheSize(2 * 1024 * 1024) // 内存缓存的最大值.diskCacheSize(50 * 1024 * 1024)  // 50 Mb sd卡(本地)缓存的最大值.tasksProcessingOrder(QueueProcessingType.LIFO)// 由原先的discCache -> diskCache.diskCache(new UnlimitedDiscCache(cacheDir))//自定义缓存路径  .imageDownloader(new BaseImageDownloader(context, 5 * 1000, 30 * 1000)) // connectTimeout (5 s), readTimeout (30 s)超时时间  .writeDebugLogs() // Remove for release app.build();//全局初始化此配置  ImageLoader.getInstance().init(config);}
}

manifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.xwj.imageloaderdemo"android:versionCode="1"android:versionName="1.0" ><uses-sdkandroid:minSdkVersion="8"android:targetSdkVersion="21" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.INTERNET" /><applicationandroid:name="com.xwj.imageloaderdemo.ImageLoaderApplication"android:allowBackup="true"android:icon="@drawable/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme" ><activityandroid:name="com.xwj.imageloaderdemo.MainActivity"android:label="@string/app_name" ><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><activity android:name="com.xwj.imageloaderdemo.ImageListActivity"></activity><activity android:name="com.xwj.imageloaderdemo.ImageGridActivity"></activity></application></manifest>
本地图片Uri:
String imageUri = "http://site.com/image.png"; // from Web  
String imageUri = "file:///mnt/sdcard/image.png"; // from SD card  
String imageUri = "content://media/external/audio/albumart/13"; // from content provider  
String imageUri = "assets://image.png"; // from assets  
String imageUri = "drawable://" + R.drawable.image; // from drawables (only images, non-9patch)  

2.1.DiskCache 磁盘缓存

1) UnlimitedDiscCache不限制缓存大小;

2) UnlimitedDiscCache很简单它只是简单的继承了BaseDiscCache并未对BaseDiscCache做任何扩展;
3) LimitedAgeDiscCache限制缓存时间;

4) LimitedAgeDiscCache该类实现了在缓存中删除被加载超过规定时间的文件:满足以下条件的时候就从缓存中删除文件:系统当前时间-文件的最新修改时间 > maxFileAge;

2.2.MemoryCache内存缓存

1) 通过实现接口MemoryCacheAware <String,Bitmap>来实现自己的缓存

2) UsingFreqLimitedCache (最少被用到的对象会被删除)

3) UsingAgeLimitedCache (最早被添加的对象会被删除)

4) LargestLimitedCache (空间占用最大的对象会被删除)

5) FIFOLimitedCache (根据先进先出的原则上删除多余对象)

2.3.不要忘记缓存的清理

一般要在整个应用结束的时候调用下面两个方法,分别情况内存缓存和磁盘缓存,提高用户体验 :
i. imageLoader.clearMemoryCache();
ii. imageLoader.clearDiskCache();


4.如果经常出现OOM(别人那边看到的,觉得很有提的必要)
①减少配置之中线程池的大小,(.threadPoolSize).推荐1-5
使用.bitmapConfig(Bitmap.config.RGB_565)代替ARGB_8888;
③使用.imageScaleType(ImageScaleType.IN_SAMPLE_INT)或者 try.imageScaleType(ImageScaleType.EXACTLY);
④避免使用RoundedBitmapDisplayer.他会创建新的ARGB_8888格式的Bitmap对象;
⑤使用.memoryCache(new WeakMemoryCache()),不要使用.cacheInMemory();

参考:

http://www.open-open.com/lib/view/open1433940304473.html

http://www.cnblogs.com/kissazi2/p/3886563.html

http://blog.csdn.net/vipzjyno1/article/details/23206387


这篇关于Universal-imageLoader缓存图片加载的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/937543

相关文章

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

缓存雪崩问题

缓存雪崩是缓存中大量key失效后当高并发到来时导致大量请求到数据库,瞬间耗尽数据库资源,导致数据库无法使用。 解决方案: 1、使用锁进行控制 2、对同一类型信息的key设置不同的过期时间 3、缓存预热 1. 什么是缓存雪崩 缓存雪崩是指在短时间内,大量缓存数据同时失效,导致所有请求直接涌向数据库,瞬间增加数据库的负载压力,可能导致数据库性能下降甚至崩溃。这种情况往往发生在缓存中大量 k

Flutter 进阶:绘制加载动画

绘制加载动画:由小圆组成的大圆 1. 定义 LoadingScreen 类2. 实现 _LoadingScreenState 类3. 定义 LoadingPainter 类4. 总结 实现加载动画 我们需要定义两个类:LoadingScreen 和 LoadingPainter。LoadingScreen 负责控制动画的状态,而 LoadingPainter 则负责绘制动画。

Android 10.0 mtk平板camera2横屏预览旋转90度横屏拍照图片旋转90度功能实现

1.前言 在10.0的系统rom定制化开发中,在进行一些平板等默认横屏的设备开发的过程中,需要在进入camera2的 时候,默认预览图像也是需要横屏显示的,在上一篇已经实现了横屏预览功能,然后发现横屏预览后,拍照保存的图片 依然是竖屏的,所以说同样需要将图片也保存为横屏图标了,所以就需要看下mtk的camera2的相关横屏保存图片功能, 如何实现实现横屏保存图片功能 如图所示: 2.mtk

Spring MVC 图片上传

引入需要的包 <dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.1</version></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-

Prompt - 将图片的表格转换成Markdown

Prompt - 将图片的表格转换成Markdown 0. 引言1. 提示词2. 原始版本 0. 引言 最近尝试将图片中的表格转换成Markdown格式,需要不断条件和优化提示词。记录一下调整好的提示词,以后在继续优化迭代。 1. 提示词 英文版本: You are an AI assistant tasked with extracting the content of

Redis中使用布隆过滤器解决缓存穿透问题

一、缓存穿透(失效)问题 缓存穿透是指查询一个一定不存在的数据,由于缓存中没有命中,会去数据库中查询,而数据库中也没有该数据,并且每次查询都不会命中缓存,从而每次请求都直接打到了数据库上,这会给数据库带来巨大压力。 二、布隆过滤器原理 布隆过滤器(Bloom Filter)是一种空间效率很高的随机数据结构,它利用多个不同的哈希函数将一个元素映射到一个位数组中的多个位置,并将这些位置的值置

研究人员在RSA大会上演示利用恶意JPEG图片入侵企业内网

安全研究人员Marcus Murray在正在旧金山举行的RSA大会上公布了一种利用恶意JPEG图片入侵企业网络内部Windows服务器的新方法。  攻击流程及漏洞分析 最近,安全专家兼渗透测试员Marcus Murray发现了一种利用恶意JPEG图片来攻击Windows服务器的新方法,利用该方法还可以在目标网络中进行特权提升。几天前,在旧金山举行的RSA大会上,该Marcus现场展示了攻击流程,

恶意PNG:隐藏在图片中的“恶魔”

&lt;img src=&quot;https://i-blog.csdnimg.cn/blog_migrate/bffb187dc3546c6c5c6b8aa18b34b962.jpeg&quot; title=&quot;214201hhuuhubsuyuukbfy_meitu_1_meitu_2.jpg&quot;/&gt;&lt;/strong&gt;&lt;/span&gt;&lt;

PHP抓取网站图片脚本

方法一: <?phpheader("Content-type:image/jpeg"); class download_image{function read_url($str) { $file=fopen($str,"r");$result = ''; while(!feof($file)) { $result.=fgets($file,9999); } fclose($file); re