- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个代码将四个图像加载到 imageview 中。为了避免大图像加载时出现 OOM 问题,我想在加载到 ImageView 之前使用 Glide/Picasso/Fresco 来调整大小。请注意,它适用于小图像,但适用于大图像(将由用户输入,因此我无法控制大小),它会在 OOM 上选择第二个大图像进行 imageview 时立即崩溃。我明白了这些谢谢
package com.ny.a4imageswithtexts;
import android.app.ProgressDialog;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Base64;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.DecodeFormat;
import com.bumptech.glide.load.engine.Resource;
import com.bumptech.glide.request.RequestOptions;
import com.bumptech.glide.request.target.CustomTarget;
import com.bumptech.glide.request.transition.Transition;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.ByteArrayOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
import javax.net.ssl.HttpsURLConnection;
public class MainActivity extends AppCompatActivity {
Bitmap bitmap1;
Bitmap bitmap2;
Bitmap bitmap3;
Bitmap bitmap4;
private int PICK_IMAGE_REQUEST1 = 1;
private int PICK_IMAGE_REQUEST2 = 2;
private int PICK_IMAGE_REQUEST3 = 1;
private int PICK_IMAGE_REQUEST4 = 2;
boolean check = true;
Button SelectImageGallery1;
Button SelectImageGallery2;
Button SelectImageGallery3;
Button SelectImageGallery4;
Button UploadImageServer;
ImageView imageView1;
ImageView imageView2;
ImageView imageView3;
ImageView imageView4;
EditText imageName1;
EditText imageName2;
EditText imageName3;
EditText imageName4;
ProgressDialog progressDialog ;
String GetImageNameEditText1;
String GetImageNameEditText2;
String GetImageNameEditText3;
String GetImageNameEditText4;
String ImageName1 = "image_name1";
String ImageName2 = "image_name2";
String ImageName3 = "image_name3";
String ImageName4 = "image_name4";
String ImagePath1 = "image_path1";
String ImagePath2 = "image_path2";
String ImagePath3 = "image_path3";
String ImagePath4 = "image_path4";
String ServerUploadPath ="http://11111111111111111.php";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView1 = findViewById(R.id.imageView1);
imageView2 = findViewById(R.id.imageView2);
imageView3 = findViewById(R.id.imageView3);
imageView4 = findViewById(R.id.imageView4);
imageName1 = findViewById(R.id.editTextImageName1);
String strImageName1 = imageName1.getText().toString();
if(TextUtils.isEmpty(strImageName1))
{imageName1.setError("Image Name Must Be Entered");
}
imageName2 = findViewById(R.id.editTextImageName2);
String strImageName2 = imageName2.getText().toString();
if(TextUtils.isEmpty(strImageName2))
{imageName2.setError("Image Name Must Be Entered");
}
imageName3 = findViewById(R.id.editTextImageName3);
String strImageName3 = imageName3.getText().toString();
if(TextUtils.isEmpty(strImageName3))
{imageName3.setError("Image Name Must Be Entered");
}
imageName4 = findViewById(R.id.editTextImageName4);
String strImageName4 = imageName4.getText().toString();
if(TextUtils.isEmpty(strImageName4))
{imageName4.setError("Image Name Must Be Entered");
}
SelectImageGallery1 = findViewById(R.id.buttonSelect1);
SelectImageGallery2 = findViewById(R.id.buttonSelect2);
SelectImageGallery3 = findViewById(R.id.buttonSelect3);
SelectImageGallery4 = findViewById(R.id.buttonSelect4);
UploadImageServer = findViewById(R.id.buttonUpload);
SelectImageGallery1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent,
"Select Image1 From Gallery"), 1);
}
});
SelectImageGallery2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Select Image4
From Gallery"), 2);
}
});
SelectImageGallery3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent,
"Select Image3 From Gallery"), 3);
}
});
SelectImageGallery4.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent,
"Select Image4 From Gallery"), 4);
}
});
UploadImageServer.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
GetImageNameEditText1 = imageName1.getText().toString();
GetImageNameEditText2 = imageName2.getText().toString();
GetImageNameEditText3 = imageName3.getText().toString();
GetImageNameEditText4 = imageName4.getText().toString();
ImageUploadToServerFunction();
}
});
}
@Override
protected void onActivityResult(int RC, int RQC, Intent I) {
super.onActivityResult(RC, RQC, I);
if (RC == 1 && RQC == RESULT_OK && I != null && I.getData() != null) {
Uri uri = I.getData();
RequestOptions options = new RequestOptions()
.format(DecodeFormat.PREFER_RGB_565)
.placeholder(R.drawable.ic_launcher_background)
.error(R.drawable.ic_launcher_background);
Glide.with(this)
.setDefaultRequestOptions(options)
.load(uri)
.centerInside()
.into(new CustomTarget<Drawable>(512, 512) {
@Override
public void onResourceReady(@NonNull Drawable
bitmap1, @Nullable Transition<? super Drawable> transition) {
imageView1.setImageDrawable(bitmap1);
}
@Override
public void onLoadCleared(@Nullable Drawable
placeholder) {
}
});
}
if (RC == 2 && RQC == RESULT_OK && I != null && I.getData() != null) {
Uri uri = I.getData();
RequestOptions options = new RequestOptions()
.format(DecodeFormat.PREFER_RGB_565)
.placeholder(R.drawable.ic_launcher_background)
.error(R.drawable.ic_launcher_background);
Glide.with(this)
.setDefaultRequestOptions(options)
.load(uri)
.centerInside()
.into(new CustomTarget<Drawable>(512, 512) {
@Override
public void onResourceReady(@NonNull Drawable
bitmap2, @Nullable Transition<? super Drawable> transition) {
imageView2.setImageDrawable(bitmap2);
}
@Override
public void onLoadCleared(@Nullable Drawable
placeholder) {
}
});
}
if (RC == 3 && RQC == RESULT_OK && I != null && I.getData() != null) {
Uri uri = I.getData();
RequestOptions options = new RequestOptions()
.format(DecodeFormat.PREFER_RGB_565)
.placeholder(R.drawable.ic_launcher_background)
.error(R.drawable.ic_launcher_background);
Glide.with(this)
.setDefaultRequestOptions(options)
.load(uri)
.centerInside()
.into(new CustomTarget<Drawable>(512, 512) {
@Override
public void onResourceReady(@NonNull Drawable
bitmap3, @Nullable Transition<? super Drawable> transition) {
imageView3.setImageDrawable(bitmap3);
}
@Override
public void onLoadCleared(@Nullable Drawable
placeholder) {
}
});
}
if (RC == 4 && RQC == RESULT_OK && I != null && I.getData() != null) {
Uri uri = I.getData();
RequestOptions options = new RequestOptions()
.format(DecodeFormat.PREFER_RGB_565)
.placeholder(R.drawable.ic_launcher_background)
.error(R.drawable.ic_launcher_background);
Glide.with(this)
.setDefaultRequestOptions(options)
.load(uri)
.centerInside()
.into(new CustomTarget<Drawable>(512, 512) {
@Override
public void onResourceReady(@NonNull Drawable
bitmap4, @Nullable Transition<? super Drawable> transition) {
imageView4.setImageDrawable(bitmap4);
}
@Override
public void onLoadCleared(@Nullable Drawable
placeholder) {
}
});
}
}
public String getStringImage1(Bitmap bitmap1){
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap1.compress(Bitmap.CompressFormat.JPEG, 80, baos);
byte[] imageBytes = baos.toByteArray();
String encodedImage1 = Base64.encodeToString(imageBytes,
Base64.DEFAULT);
return encodedImage1;
}
public String getStringImage2(Bitmap bitmap2){
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap2.compress(Bitmap.CompressFormat.JPEG, 80, baos);
byte[] imageBytes = baos.toByteArray();
String encodedImage2 = Base64.encodeToString(imageBytes,
Base64.DEFAULT);
return encodedImage2;
}
public String getStringImage3(Bitmap bitmap3){
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap3.compress(Bitmap.CompressFormat.JPEG, 80, baos);
byte[] imageBytes = baos.toByteArray();
String encodedImage3 = Base64.encodeToString(imageBytes,
Base64.DEFAULT);
return encodedImage3;
}
public String getStringImage4(Bitmap bitmap4){
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap4.compress(Bitmap.CompressFormat.JPEG, 80, baos);
byte[] imageBytes = baos.toByteArray();
String encodedImage4 = Base64.encodeToString(imageBytes,
Base64.DEFAULT);
return encodedImage4;
}
public void ImageUploadToServerFunction(){
final String imageName1 = GetImageNameEditText1.trim();
final String imageName2 = GetImageNameEditText2.trim();
final String imageName3 = GetImageNameEditText3.trim();
final String imageName4 = GetImageNameEditText4.trim();
final String imageView1 = getStringImage1(bitmap1);
final String imageView2 = getStringImage2(bitmap2);
final String imageView3 = getStringImage3(bitmap3);
final String imageView4 = getStringImage4(bitmap4);
class AsyncTaskUploadClass extends AsyncTask<Void,Void,String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
progressDialog =
ProgressDialog.show(MainActivity.this,"Image is Uploading","Please
Wait",false,false);
}
@Override
protected void onPostExecute(String string1) {
super.onPostExecute(string1);
// Dismiss the progress dialog after done uploading.
progressDialog.dismiss();
// Printing uploading success message coming from
server on android app.
Toast.makeText(MainActivity.this,string1,Toast.LENGTH_LONG).show();
// Setting image as transparent after done uploading.
ImageView cleared1 = findViewById(R.id.imageView1);
cleared1.setImageResource(android.R.color.transparent);
ImageView cleared2 = findViewById(R.id.imageView2);
cleared2.setImageResource(android.R.color.transparent);
ImageView cleared3 = findViewById(R.id.imageView3);
cleared3.setImageResource(android.R.color.transparent);
ImageView cleared4 = findViewById(R.id.imageView4);
cleared4.setImageResource(android.R.color.transparent);
}
@Override
protected String doInBackground(Void... params) {
ImageProcessClass imageProcessClass = new ImageProcessClass();
HashMap<String,String> HashMapParams = new
HashMap<String,String>();
HashMapParams.put(ImageName1, imageName1);
HashMapParams.put(ImageName2, imageName2);
HashMapParams.put(ImageName3, imageName3);
HashMapParams.put(ImageName4, imageName4);
HashMapParams.put(ImagePath1, imageView1);
HashMapParams.put(ImagePath2, imageView2);
HashMapParams.put(ImagePath3, imageView3);
HashMapParams.put(ImagePath4, imageView4);
String FinalData =
imageProcessClass.ImageHttpRequest(ServerUploadPath, HashMapParams);
return FinalData;
}
}
AsyncTaskUploadClass AsyncTaskUploadClassOBJ = new
AsyncTaskUploadClass();
AsyncTaskUploadClassOBJ.execute();
}
public class ImageProcessClass{
public String ImageHttpRequest(String
requestURL,HashMap<String, String> PData) {
StringBuilder stringBuilder = new StringBuilder();
try {
URL url;
HttpURLConnection httpURLConnectionObject ;
OutputStream OutPutStream;
BufferedWriter bufferedWriterObject ;
BufferedReader bufferedReaderObject ;
int RC ;
url = new URL(requestURL);
httpURLConnectionObject = (HttpURLConnection)
url.openConnection();
httpURLConnectionObject.setReadTimeout(19000);
httpURLConnectionObject.setConnectTimeout(19000);
httpURLConnectionObject.setRequestMethod("POST");
httpURLConnectionObject.setDoInput(true);
httpURLConnectionObject.setDoOutput(true);
OutPutStream = httpURLConnectionObject.getOutputStream();
bufferedWriterObject = new BufferedWriter(
new OutputStreamWriter(OutPutStream, "UTF8"));
bufferedWriterObject.write(bufferedWriterDataFN(PData));
bufferedWriterObject.flush();
bufferedWriterObject.close();
OutPutStream.close();
RC = httpURLConnectionObject.getResponseCode();
if (RC == HttpsURLConnection.HTTP_OK) {
bufferedReaderObject = new BufferedReader(new
InputStreamReader(httpURLConnectionObject.getInputStream()));
stringBuilder = new StringBuilder();
String RC2;
while ((RC2 = bufferedReaderObject.readLine()) != null){
stringBuilder.append(RC2);
}
}
} catch (Exception e) {
e.printStackTrace();
}
return stringBuilder.toString();
}
private String bufferedWriterDataFN(HashMap<String, String>
HashMapParams) throws UnsupportedEncodingException {
StringBuilder stringBuilderObject;
stringBuilderObject = new StringBuilder();
for (Map.Entry<String, String> KEY : HashMapParams.entrySet()) {
if (check)
check = false;
else
stringBuilderObject.append("&");
stringBuilderObject.append(URLEncoder.encode(KEY.getKey(), "UTF-8"));
stringBuilderObject.append("=");
stringBuilderObject.append(URLEncoder.encode(KEY.getValue(),
"UTF-8"));
}
return stringBuilderObject.toString();
}
}
}
'''
最佳答案
即使有 Glide 和 Picasso 存在,我在应用程序中也遇到了同样的问题。我通过指定所需 View 的高度和宽度解决了这个问题。因此,应用程序不会超出应用程序和移动设备的内存限制。这是我的应用程序中的一段代码。
val options = RequestOptions()
.format(DecodeFormat.PREFER_RGB_565)
.placeholder(R.drawable.ic_placeholder)
.error(R.drawable.ic_error)
Glide.with(this)
.setDefaultRequestOptions(options)
.load(campaign!!.imageURL)
.centerInside()
.into(object : CustomTarget<Drawable>(width, height) {
override fun onResourceReady(resource: Drawable, transition: Transition<in Drawable>?) {
imagePort.setImageDrawable(resource)
}
override fun onLoadCleared(placeholder: Drawable?) {
}
})
代码的更改:我执行了你的代码,它将是使用 glide 的工作副本。只是不要忘记在 gradle 文件中添加 glide 依赖项
implementation 'com.github.bumptech.glide:glide:4.11.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0'
你的 onActivityResult 函数的变化...
protected void onActivityResult(int RC, int RQC, Intent I) {
super.onActivityResult(RC, RQC, I);
if (RC == 1 && RQC == RESULT_OK && I != null && I.getData() != null) {
Uri uri = I.getData();
RequestOptions options = new RequestOptions()
.format(DecodeFormat.PREFER_RGB_565)
.placeholder(R.drawable.ic_launcher_background)
.error(R.drawable.ic_launcher_background);
Glide.with(this)
.setDefaultRequestOptions(options)
.load(uri)
.centerInside()
.into(new CustomTarget<Drawable>(1000, 500) {
@Override
public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {
imageView1.setImageDrawable(resource);
}
@Override
public void onLoadCleared(@Nullable Drawable placeholder) {
}
});
}
关于java - 实现 Glide/Fresco/Picasso 在加载到 Imageview 之前调整图像大小,以避免 OOM 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59746828/
我在项目中添加 fresco 依赖项时遇到问题。 这里有一些问题的截图 最佳答案 你必须改变 compile 'com.facebook.fresco:fresco:0.8.1+' 与 compile
我想将 Fresco 库导入到我的项目中,所以我将以下行添加到我的 build.gradle 文件的依赖项部分: 编译'com.facebook.fresco:fresco:0.7.0+' 然后我构建
添加这个并没有解决我的问题implementation(“com.facebook.fresco:nativeimagetranscoder:3.0.0”)。但这解决了我使用Android Studi
我正在将 android 图像缓存库从 picasso 迁移到 fresco。我想知道是否有任何方法可以使已经捕捉到的图像无效,因为我正在添加功能来替换现有图像有办法在 picasso 中这样做 Pi
我有一个父 Activity ,其中有一个 SimpleDraweeView。我正在使用以下代码将图像附加到 SimpleDraweeView, Fresco.initialize(this); B
我是安卓新手。下面是我复制并稍微修改的示例代码,但它无法为 gif 图像设置动画。它只是在我的应用程序中显示为静态图像。 gifImage 没有动画。我什至尝试两次初始化 Controller 。
我有一些大小未知的本地镜像。格式为 jpeg。任务是调整它的大小以适应最大尺寸 1280x960 保持原始纵横比,并以低内存消耗将其保存到新文件。我在 Fresco lib 中找到了一个非常有用的方法
我一直在尝试通过 Facebook 使用 Fresco 库。 从文档中我了解到,当我们使用 SimpleDraweeView 时,图像缓存与 ImagePipeline 开箱即用。尽管 Fresco
我正在使用 Fresco 构建一个应用程序图书馆,通过 Facebook。 如果我的应用程序可在不同设备之间使用,我在尝试理解如何使用 Fresco 实现 View 时遇到了问题。正如您在附图中看到的
我刚刚迁移到 Fresco 库以在我的应用程序中加载图像。 我需要监听图像加载事件,当然我在文档中阅读了这篇文章 Listening to download events 这正是我所需要的,但是...
我正在上传一张图片到我的服务器,上传后我的服务器用新的 URI 响应它(可以是与旧的相同的 URL),我想删除旧的缓存图片并插入新的新的 URI。 我尝试通过以下方式实现: // Retrofit2
我正在尝试将图库中的图像显示到 SimpleDraweeView 中。我不知道这是不是这样做的方法,但我正在做的是进入画廊,选择图像并获取图像路径。之后,我使用 galleryImage.setIma
我正在使用 Fresco 库将图像和 gif 文件加载到我的应用程序中。我在使用 Fresco 时遇到的最大限制是必须设置布局宽度和高度。所以我已经像这样设置了我的简单受票人 View : 我的问
我在 azure 中托管我的应用程序(Web 服务 + 文件存储服务)。 我希望在我的应用程序中使用 Fresco (SimpleDraweeView),问题是我无法向用户提供直接的 url,因为 a
我有一个 SimpleDraweeView,它通过 Controller 处理图像请求: Postprocessor redMeshPostprocessor = new BasePostproces
我想知道是否有一种方法可以替换 Fresco 中的图像,而无需从服务器重新加载它。我有一个应用程序,让用户修改图像,然后将新图像上传到服务器。然而,按照 Fresco 的工作方式,我需要上传新图像,从
java.lang.IllegalMonitorStateException: unlock of unowned monitor on object of type 'com.facebook.c
我想在我的 android 应用程序中通过 fresco 加载图像后执行共享元素过渡动画。我按照此处所述收听下载事件; http://frescolib.org/docs/listening-down
我正在使用 fresco 向我的应用程序显示图像。现在我正在尝试对我的图像应用一些过滤器,但问题是过滤器库只产生位图。但 draweeView.setImageBitmap 已弃用。 我也试过这样的后
我刚刚开始使用 fresco,我已经按照他们文档中的步骤进行操作。我已经能够将 URI 加载到我的 ListView 适配器中的 SimpleDraweeView 中,现在我正在尝试实现渐进式 jpe
我是一名优秀的程序员,十分优秀!