如何将图片URL转换为可绘制整数(Drawable Int)

6

大家早上好!!!

我正在尝试在ImageView中显示图片。但我的要求是,我需要以Drawable Integer格式显示图像。我从服务器获取数据并以URL格式获得图像。

For ex :http://www.mymartmycart.com/images/detailed/3/4G_CONNECT_M1.jpeg

我希望将这张图片转换为可绘制格式。
这是我的代码
这是我的界面。
 public interface ECCardData<T> {

    @DrawableRes
    Integer getMainBackgroundResource();

    @DrawableRes
    Integer getHeadBackgroundResource();

    List<T> getListItems();
}

我的Getter和Setter

     private Integer headBackgroundResource;

public Integer getHeadBackgroundResource() {
        return headBackgroundResource;
    }

    public void setHeadBackgroundResource(Integer headBackgroundResource) {
        this.headBackgroundResource = headBackgroundResource;
    }

以下是我设置图像的代码

Integer drawableRes = dataset.get(position).getHeadBackgroundResource();
    if (drawableRes != null) {
        headView.setHeadImageBitmap(BitmapFactory.decodeResource(pagerContainer.getResources(), drawableRes, new BitmapFactoryOptions()));
    }

这是我的解析

 public static ArrayList<CardData> ParseCraft(String response) throws JSONException {


        ArrayList<CardData> alUser = new ArrayList<>();

        JSONObject jsonRoot = new JSONObject(response);

        JSONArray parentArray = jsonRoot.getJSONArray("products");

        for (int j = 0; j < parentArray.length(); j++) {

            JSONObject finalObject = parentArray.getJSONObject(j);

            CardData user = new CardData();

            user.setHeadTitle(finalObject.getString("product"));
            user.setPersonName(finalObject.getString("product_code"));

            JSONObject productJsonObject = finalObject.getJSONObject("main_pair");
            JSONObject productJsonObject1 = productJsonObject.getJSONObject("detailed");

            user.setHeadBackgroundResource(productJsonObject1.getString("image_path"));



            alUser.add(user);
        }

        return alUser;
    }

我的 JSON 响应

{
"products": [
    {
        "product_id": "863",
        "product": "LAVA 4G CONNECT M1",
        "company_name": "SAPTHAGIRI MOBILES",
        "age_verification": "N",
        "age_limit": "0",
        "product_code": "SGMM00044",
        "product_type": "P",
        "status": "A",
        "company_id": "34",
        "approved": "Y",
        "list_price": "0.00",
        "amount": "2",
        "weight": "0.000",
        "length": "0",
        "width": "0",
        "height": "0",
        "shipping_freight": "0.00",
        "low_avail_limit": "0",
        "timestamp": "1492758588",
        "updated_timestamp": "1500273558",
        "usergroup_ids": "0",
        "is_edp": "N",
        "edp_shipping": "N",
        "unlimited_download": "N",
        "tracking": "B",
        "free_shipping": "N",
        "zero_price_action": "R",
        "is_pbp": "N",
        "is_op": "N",
        "is_oper": "N",
        "is_returnable": "Y",
        "return_period": "10",
        "avail_since": "0",
        "out_of_stock_actions": "N",
        "localization": "",
        "min_qty": "0",
        "max_qty": "0",
        "qty_step": "0",
        "list_qty_count": "0",
        "tax_ids": "",
        "options_type": "P",
        "exceptions_type": "F",
        "details_layout": "default",
        "shipping_params": "a:5:{s:16:\"min_items_in_box\";i:0;s:16:\"max_items_in_box\";i:0;s:10:\"box_length\";i:0;s:9:\"box_width\";i:0;s:10:\"box_height\";i:0;}",
        "facebook_obj_type": "activity",
        "buy_now_url": "",
        "cod": "N",
        "price": "3094.000000",
        "category_ids": [
            295
        ],
        "position": "0",
        "seo_name": "lava-4g-connect-m1",
        "seo_path": "166/234/295",
        "average_rating": null,
        "discussion_type": "D",
        "discussion_thread_id": "619",
        "main_category": 295,
        "main_pair": {
            "pair_id": "2577",
            "image_id": "0",
            "detailed_id": "3266",
            "position": "0",
            "detailed": {
                "object_id": "863",
                "object_type": "product",
                "image_path": "http://www.mymartmycart.com/images/detailed/3/4G_CONNECT_M1.jpeg",
                "alt": "",
                "image_x": "635",
                "image_y": "476",
                "http_image_path": "http://www.mymartmycart.com/images/detailed/3/4G_CONNECT_M1.jpeg",
                "https_image_path": "https://www.mymartmycart.com/images/detailed/3/4G_CONNECT_M1.jpeg",
                "absolute_path": "/home/mymartmycart/public_html/images/detailed/3/4G_CONNECT_M1.jpeg",
                "relative_path": "detailed/3/4G_CONNECT_M1.jpeg"
            }
        },
        "base_price": "3094.000000",
        "selected_options": [],
        "has_options": false,
        "product_options": [],
        "discounts": {
            "A": 0,
            "P": 0
        },
        "product_features": [],
        "qty_content": []
    }

这可能会有所帮助:https://dev59.com/3nA75IYBdhLWcg3wS29A - Gregorius Giovanni Roswin
1
如果您只想在ImageView中显示来自服务器URL的图像,则可以使用Glide或Picaso库将其直接显示到ImageView。 - Snehal Gongle
1
@harshal,你也可以将你的URL转换为位图,并将位图设置到你的ImageView中。这里有一个将URL转换为位图的链接:https://dev59.com/p2gt5IYBdhLWcg3wxANj - Snehal Gongle
好的。让我试一下这个。 - Harshal Deshmukh
R.drawable.something 是在编译时创建的资源ID,您无法将下载的图像“添加”/“转换”为 R.drawable。您的界面设计是错误的 - 您应该使用 android.graphics.drawable.Drawable 概念。 - pskink
显示剩余3条评论
6个回答

4

这段代码可以将服务器图片的URL转换为位图

 String drawableRes="http://kartpay.biz/api/v1/file/banner/IHMOcSHU7yoTVOkwYi1bOOz8shrXXrJhayCPFO17.jpeg"
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);
        try {
            URL url = new URL(drawableRes);
            headView.setHeadImageBitmap(BitmapFactory.decodeStream((InputStream)url.getContent()));
        } catch (IOException e) {
            //Log.e(TAG, e.getMessage());
        }

2
你可以使用协程在后台进行这项工作:
    private fun loadImageFromWebUrl(url: String?) {
    lifecycleScope.launch(Dispatchers.IO) {
        val image  = try {
            val iStream = java.net.URL(url).content as InputStream
            Drawable.createFromStream(iStream, "src name")
        } catch (e: Exception) {
            null
        }

        image?.let {
            withContext(Dispatchers.Main){
                imageView.setImageDrawable = image 
            }
        }
    }
}

2020年有比这更好的方法吗? - Andrew

0

欢迎提供解决方案的链接,但请确保您的回答即使没有链接也有用。为了让其他用户知道链接是什么以及为什么需要它,请在链接周围添加上下文:添加链接说明,然后在引用链接页中最相关的部分,以防目标页面无法访问。那些只是链接的回答可能会被删除。 - rizerphe

0

我认为将图像URL转换为Drawable int是不可能的

您可以使用库从URL显示图像,请尝试以下内容

1. Glide

您可以使用Glide库从URL加载图像,查看下面的代码,它可以帮助您以简单的方式进行操作

编译此库

  compile 'com.github.bumptech.glide:glide:4.0.0'

然后像这样加载图像

RequestOptions requestOptions = new RequestOptions();
requestOptions.placeholder(R.drawable.ic_placeholder);
requestOptions.error(R.drawable.ic_error);

Glide.with(context)
     .setDefaultRequestOptions(requestOptions)
     .load(mainMenuDataModelArrayList.get(position)
     .getIMG()).into(holder.imageView);

2. 使用 Picasso

编译此库

compile 'com.squareup.picasso:picasso:2.5.2'

然后像这样加载图片

Picasso.
  with(context).
  load(url).
  into(imageview);

或者试试这个

 new DownloadImage(imamgeview).execute(url);

创建一个异步任务。
public class DownloadImage extends AsyncTask<String, Void, Bitmap> {
ImageView bmImage;

public DownloadImage(ImageView bmImage) {
    this.bmImage = (ImageView ) bmImage;
}

protected Bitmap doInBackground(String... urls) {
    String urldisplay = urls[0];
    Bitmap mIcon11 = null;
    try {
        InputStream in = new java.net.URL(urldisplay).openStream();
        mIcon11 = BitmapFactory.decodeStream(in);
    } catch (Exception e) {
        Log.d("Error", e.getStackTrace().toString());

    }
    return mIcon11;
}

protected void onPostExecute(Bitmap result) {
    bmImage.setImageBitmap(result);
}
}

我已经尝试了Glide和Picasso,但无法显示图片。我正在使用Ramotion Expandable Collection Animation Library。在此中,只有整数图像按照以上提供的代码进行声明。在此之前,静态图像设置为ex.R.Drwable.Image1。但是现在我想动态设置它。 - Harshal Deshmukh
哪个异常共享它? - AskNilesh
如何将字符串Image_url转换为resource_id @Nilesh。我在网上尝试了解决方案,但没有起作用?这是我的url_image:http://www.mymartmycart.com/images/detailed/3/4G_CONNECT_M1.jpeg 我尝试的解决方案是int resID = pagerContainer.getResources().getIdentifier(drawableRes,"drawable",dataset.get(position).getHeadBackgroundResource()); @Snehal Gongle请帮忙 - Harshal Deshmukh

0
你可以通过以下代码从服务器URL下载图像到你的图像视图
public static Drawable LoadImageFromWebURL(String url) {
try {
    InputStream iStream = (InputStream) new URL(url).getContent();
    Drawable drawable = Drawable.createFromStream(ist, "src name");
    return drawable;
} catch (Exception e) {
    return null;
}}

你也可以使用第三方库将图像直接下载到imageView中

compile 'com.squareup.picasso:picasso:2.5.2'

Picasso.with(context).load("image web url").into(imageView);

-1
可以使用Picasso库:
添加Gradle:
compile 'com.squareup.picasso:picasso:2.5.2'

Picasso.with(context).load("http://www.mymartmycart.com/images/detailed/3/4G_CONNECT_M1.jpeg").into(imageView);

更多信息 http://square.github.io/picasso/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接