Android 使用Facebook';s Fresco以加载位图
我正试图用Fresco取代我android应用程序中的毕加索。然而,我不确定如何使用湿壁画加载位图 对于毕加索,我会做以下几点Android 使用Facebook';s Fresco以加载位图,android,facebook,bitmap,picasso,fresco,Android,Facebook,Bitmap,Picasso,Fresco,我正试图用Fresco取代我android应用程序中的毕加索。然而,我不确定如何使用湿壁画加载位图 对于毕加索,我会做以下几点 Bitmap poster = Picasso.with(getActivity()) .load(url) .resize(Utils.convertDpToPixel(WIDTH,HEIGHT)) .centerCrop()
Bitmap poster = Picasso.with(getActivity())
.load(url)
.resize(Utils.convertDpToPixel(WIDTH,HEIGHT))
.centerCrop()
.get();
我一直不知道如何用这幅壁画创建位图。有什么想法吗 您可以直接使用Fresco的图像管道:
public class DownloadVideoThumbnail extends AsyncTask<String, Void, Bitmap> {
private ImageView bmImage;
private Bitmap bitmapVideo;
private Context context;
public DownloadVideoThumbnail(Context context, ImageView bmImage) {
this.bmImage = (ImageView) bmImage;
this.context = context;
}
protected Bitmap doInBackground(String... urls) {
String urlStr = urls[0];
if (readFromCacheSync(urlStr) == null) {
try {
//Your method call here
bitmapVideo = retriveVideoFrameFromVideo(urlStr);
} catch (Throwable throwable) {
throwable.printStackTrace();
}
} else {
bitmapVideo = readFromCacheSync(urlStr);
}
return null;
}
protected void onPostExecute(Bitmap result) {
if (bitmapVideo != null) {
//Load your bitmap here
bmImage.setImageBitmap(bitmapVideo);
bmImage.setScaleType(ImageView.ScaleType.CENTER_CROP);
}
}
public void cacheBitmap(Bitmap bitmap, String url) {
try {
CacheKey cacheKey = new SimpleCacheKey(url);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
final byte[] byteArray = stream.toByteArray();
Fresco.getImagePipelineFactory().getMainFileCache().insert(cacheKey, new WriterCallback() {
@Override
public void write(OutputStream outputStream) throws IOException {
outputStream.write(byteArray);
}
});
} catch (IOException cacheWriteException) {
}
}
public static Bitmap readFromCacheSync(String imageUrl) {
CacheKey cacheKey = DefaultCacheKeyFactory.getInstance().getEncodedCacheKey(ImageRequest.fromUri(imageUrl), null);
StagingArea stagingArea = StagingArea.getInstance();
EncodedImage encodedImage = stagingArea.get(cacheKey);
if (encodedImage != null) {
return BitmapFactory.decodeStream(encodedImage.getInputStream());
}
try {
return BitmapFactory.decodeStream(readFromDiskCache(cacheKey));
} catch (Exception e) {
return null;
}
}
private static InputStream readFromDiskCache(final CacheKey key) throws IOException {
try {
FileCache fileCache = ImagePipelineFactory.getInstance().getMainFileCache();
final BinaryResource diskCacheResource = fileCache.getResource(key);
if (diskCacheResource == null) {
FLog.v(TAG, "Disk cache miss for %s", key.toString());
return null;
}
PooledByteBuffer byteBuffer;
final InputStream is = diskCacheResource.openStream();
FLog.v(TAG, "Successful read from disk cache for %s", key.toString());
return is;
} catch (IOException ioe) {
return null;
}
}
public Bitmap retriveVideoFrameFromVideo(String videoPath) throws Throwable {
Bitmap bitmap = null;
MediaMetadataRetriever mediaMetadataRetriever = null;
try {
mediaMetadataRetriever = new MediaMetadataRetriever();
if (Build.VERSION.SDK_INT >= 14)
mediaMetadataRetriever.setDataSource(videoPath, new HashMap<String, String>());
else
mediaMetadataRetriever.setDataSource(videoPath);
bitmap = mediaMetadataRetriever.getFrameAtTime();
if (bitmap != null) {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 70, stream);
cacheBitmap(bitmap, videoPath);
}
} catch (Exception e) {
e.printStackTrace();
throw new Throwable(
"Exception in retriveVideoFrameFromVideo(String videoPath)"
+ e.getMessage());
} finally {
if (mediaMetadataRetriever != null) {
mediaMetadataRetriever.release();
}
}
return bitmap;
}
}
如果你不介意我问的话,这里的动机是什么?为什么需要位图本身?正如Fresco所说:
如果您对管道的请求是解码图像(Android位图),您可以利用我们易于使用的BaseBitmapDataSubscriber:
dataSource.subscribe(new BaseBitmapDataSubscriber() {
@Override
public void onNewResultImpl(@Nullable Bitmap bitmap) {
// You can use the bitmap in only limited ways
// No need to do any cleanup.
}
@Override
public void onFailureImpl(DataSource dataSource) {
// No cleanup required here.
}
},
executor);
不能将位图分配给不在onNewResultImpl方法范围内的任何变量
我的代码:
public void setDataSubscriber(Context context, Uri uri, int width, int height){
DataSubscriber dataSubscriber = new BaseDataSubscriber<CloseableReference<CloseableBitmap>>() {
@Override
public void onNewResultImpl(
DataSource<CloseableReference<CloseableBitmap>> dataSource) {
if (!dataSource.isFinished()) {
return;
}
CloseableReference<CloseableBitmap> imageReference = dataSource.getResult();
if (imageReference != null) {
final CloseableReference<CloseableBitmap> closeableReference = imageReference.clone();
try {
CloseableBitmap closeableBitmap = closeableReference.get();
Bitmap bitmap = closeableBitmap.getUnderlyingBitmap();
if(bitmap != null && !bitmap.isRecycled()) {
//you can use bitmap here
}
} finally {
imageReference.close();
closeableReference.close();
}
}
}
@Override
public void onFailureImpl(DataSource dataSource) {
Throwable throwable = dataSource.getFailureCause();
// handle failure
}
};
getBitmap(context, uri, width, height, dataSubscriber);
}
/**
*
* @param context
* @param uri
* @param width
* @param height
* @param dataSubscriber
*/
public void getBitmap(Context context, Uri uri, int width, int height, DataSubscriber dataSubscriber){
ImagePipeline imagePipeline = Fresco.getImagePipeline();
ImageRequestBuilder builder = ImageRequestBuilder.newBuilderWithSource(uri);
if(width > 0 && height > 0){
builder.setResizeOptions(new ResizeOptions(width, height));
}
ImageRequest request = builder.build();
DataSource<CloseableReference<CloseableImage>>
dataSource = imagePipeline.fetchDecodedImage(request, context);
dataSource.subscribe(dataSubscriber, UiThreadExecutorService.getInstance());
}
public void setDataSubscriber(上下文上下文、Uri、int-width、int-height){
DataSubscriber DataSubscriber=新BaseDataSubscriber(){
@凌驾
公共无效(
数据源(数据源){
如果(!dataSource.isFinished()){
返回;
}
CloseableReference imageReference=dataSource.getResult();
如果(imageReference!=null){
final CloseableReference CloseableReference=imageReference.clone();
试一试{
CloseableBitmap CloseableBitmap=closeableReference.get();
位图位图=closeableBitmap.getUnderlyingBitmap();
if(bitmap!=null&!bitmap.isRecycled()){
//你可以在这里使用位图
}
}最后{
imageReference.close();
closeableReference.close();
}
}
}
@凌驾
public void onFailureImpl(数据源数据源){
Throwable-Throwable=dataSource.getFailureCause();
//处理失败
}
};
getBitmap(上下文、uri、宽度、高度、dataSubscriber);
}
/**
*
*@param上下文
*@param-uri
*@参数宽度
*@param高度
*@param数据订阅器
*/
public void getBitmap(上下文上下文、Uri、int-width、int-height、DataSubscriber-DataSubscriber){
ImagePipeline ImagePipeline=Fresco.getImagePipeline();
ImageRequestBuilder=ImageRequestBuilder.newBuilderWithSource(uri);
如果(宽度>0和高度>0){
setResizeOptions(新的尺寸选项(宽度、高度));
}
ImageRequest请求=builder.build();
数据来源
dataSource=imagePipeline.fetchDecodedImage(请求、上下文);
订阅(dataSubscriber,UiThreadExecutorService.getInstance());
}
您可以直接使用Fresco的CacheKey执行以下操作:
public class DownloadVideoThumbnail extends AsyncTask<String, Void, Bitmap> {
private ImageView bmImage;
private Bitmap bitmapVideo;
private Context context;
public DownloadVideoThumbnail(Context context, ImageView bmImage) {
this.bmImage = (ImageView) bmImage;
this.context = context;
}
protected Bitmap doInBackground(String... urls) {
String urlStr = urls[0];
if (readFromCacheSync(urlStr) == null) {
try {
//Your method call here
bitmapVideo = retriveVideoFrameFromVideo(urlStr);
} catch (Throwable throwable) {
throwable.printStackTrace();
}
} else {
bitmapVideo = readFromCacheSync(urlStr);
}
return null;
}
protected void onPostExecute(Bitmap result) {
if (bitmapVideo != null) {
//Load your bitmap here
bmImage.setImageBitmap(bitmapVideo);
bmImage.setScaleType(ImageView.ScaleType.CENTER_CROP);
}
}
public void cacheBitmap(Bitmap bitmap, String url) {
try {
CacheKey cacheKey = new SimpleCacheKey(url);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
final byte[] byteArray = stream.toByteArray();
Fresco.getImagePipelineFactory().getMainFileCache().insert(cacheKey, new WriterCallback() {
@Override
public void write(OutputStream outputStream) throws IOException {
outputStream.write(byteArray);
}
});
} catch (IOException cacheWriteException) {
}
}
public static Bitmap readFromCacheSync(String imageUrl) {
CacheKey cacheKey = DefaultCacheKeyFactory.getInstance().getEncodedCacheKey(ImageRequest.fromUri(imageUrl), null);
StagingArea stagingArea = StagingArea.getInstance();
EncodedImage encodedImage = stagingArea.get(cacheKey);
if (encodedImage != null) {
return BitmapFactory.decodeStream(encodedImage.getInputStream());
}
try {
return BitmapFactory.decodeStream(readFromDiskCache(cacheKey));
} catch (Exception e) {
return null;
}
}
private static InputStream readFromDiskCache(final CacheKey key) throws IOException {
try {
FileCache fileCache = ImagePipelineFactory.getInstance().getMainFileCache();
final BinaryResource diskCacheResource = fileCache.getResource(key);
if (diskCacheResource == null) {
FLog.v(TAG, "Disk cache miss for %s", key.toString());
return null;
}
PooledByteBuffer byteBuffer;
final InputStream is = diskCacheResource.openStream();
FLog.v(TAG, "Successful read from disk cache for %s", key.toString());
return is;
} catch (IOException ioe) {
return null;
}
}
public Bitmap retriveVideoFrameFromVideo(String videoPath) throws Throwable {
Bitmap bitmap = null;
MediaMetadataRetriever mediaMetadataRetriever = null;
try {
mediaMetadataRetriever = new MediaMetadataRetriever();
if (Build.VERSION.SDK_INT >= 14)
mediaMetadataRetriever.setDataSource(videoPath, new HashMap<String, String>());
else
mediaMetadataRetriever.setDataSource(videoPath);
bitmap = mediaMetadataRetriever.getFrameAtTime();
if (bitmap != null) {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 70, stream);
cacheBitmap(bitmap, videoPath);
}
} catch (Exception e) {
e.printStackTrace();
throw new Throwable(
"Exception in retriveVideoFrameFromVideo(String videoPath)"
+ e.getMessage());
} finally {
if (mediaMetadataRetriever != null) {
mediaMetadataRetriever.release();
}
}
return bitmap;
}
}
公共类下载视频任务{
私有图像视图bmImage;
私有位图位图视频;
私人语境;
公共下载视频缩略图(上下文、图像视图和图像){
this.bmImage=(ImageView)bmImage;
this.context=上下文;
}
受保护位图doInBackground(字符串…URL){
字符串urlStr=URL[0];
if(readFromCacheSync(urlStr)==null){
试一试{
//你的方法在这里调用
bitmapVideo=RetrieveVideoFrameFromVideo(urlStr);
}捕捉(可抛可抛){
printStackTrace();
}
}否则{
bitmapVideo=readFromCacheSync(urlStr);
}
返回null;
}
受保护的void onPostExecute(位图结果){
如果(位图视频!=null){
//在此处加载位图
bmImage.setImageBitmap(位图视频);
bmImage.setScaleType(ImageView.ScaleType.CENTER\U裁剪);
}
}
公共无效缓存位图(位图位图、字符串url){
试一试{
CacheKey CacheKey=新的SimpleCacheKey(url);
ByteArrayOutputStream=新建ByteArrayOutputStream();
压缩(bitmap.CompressFormat.JPEG,100,流);
最后一个字节[]byteArray=stream.toByteArray();
Fresco.getImagePipelineFactory().getMainFileCache().insert(cacheKey,新WriterCallback()){
@凌驾
公共无效写入(OutputStream OutputStream)引发IOException{
outputStream.write(byteArray);
}
});
}捕获(IOException cacheWriteException){
}
}
公共静态位图readFromCacheSync(字符串imageUrl){
CacheKey CacheKey=DefaultCacheKeyFactory.getInstance().getEncodedCacheKey(ImageRequest.fromUri(imageUrl),null);
stagingrea stagingrea=stagingrea.getInstance();
EncodedImage EncodedImage=stagingArea.get(cacheKey);
if(encodedImage!=null){
返回BitmapFactory.decodeStream(encodedImage.getInputStream());
}
试一试{
返回BitmapFactory.decodeStream(readFromDiskCache(cacheKey));
}捕获(例外e){
返回null;
}
}
私有静态InputStream readFromDiskCache(最终缓存密钥)引发IOException{
试一试{
FileCache FileCache=ImagePipelineFactory.getInstance().getMainFileCache();
final BinaryResource diskCacheResource=fileCache.getResource(键);
if(diskCacheResource==null){
FLog.v(标记为“%s的磁盘缓存未命中”,key.toString());
返回null;
}
按缓冲区和缓冲区合并;
最终的InputStream=diskCacheResource.openStream();
FLog.v(标记“成功读取%s的磁盘缓存”,key.toString());
回报是;
}捕获(ioe异常ioe){
返回null;
}
}
公共位图RetrieveVideoFrameFromVideo(字符串视频路径)抛出可丢弃{
位图=空;
MediaMetadataRetriever MediaMetadataRetriever=null;
试一试{
mediaMetadataRetriever=新的mediaMetadataRetriever();
如果(Build.VERSION.SDK_INT>=14)
setDataSource(videoPath,newhashmap());
其他的
mediaMetadataRetriever.setDataSource(videoPath);
/**
* The bitmap passed into [block] is only valid during the execution of the method.
*/
fun <T> CloseableReference<CloseableBitmap>.useBitmap(block: (Bitmap?) -> T): T? {
return try {
this.get()?.underlyingBitmap?.let { block(it) }
} finally {
CloseableReference.closeSafely(this)
}
}
suspend fun getBitmapFromUri(imageUri: Uri): Bitmap = withContext(Dispatchers.Default) {
val imageRequest = ImageRequestBuilder.newBuilderWithSource(imageUri).build()
val dataSource = Fresco.getImagePipeline().fetchDecodedImage(imageRequest, this)
val result = DataSources.waitForFinalResult(dataSource) as CloseableReference<CloseableBitmap>
val bitmap = result.get().underlyingBitmap
CloseableReference.closeSafely(result)
dataSource.close()
return@withContext bitmap
}