Android 实现在图片上画标注框

该文章描述了一种在Android应用中处理网络图片的方法,首先通过HttpURLConnection下载图片,然后在Bitmap上绘制标注框,接着压缩图片并保存到本地。整个过程通过AsyncTask实现,以避免阻塞UI线程。最后使用Glide展示已处理的图片。
摘要由CSDN通过智能技术生成

之前是用glide加载然后在图片上画标注框是有问题的所以换了另外一种方式

思路:1.先把网络图片下载到本地之后画标注框 最后再压缩图片 及展示

上代码:

下载图片:

public class NetWorkUtils {


    public static InputStream getImageInputStream(String imageUrl) {
        URL url = null;
        HttpURLConnection urlConnection = null;
        try {
            url = new URL(imageUrl);
            urlConnection = (HttpURLConnection) url.openConnection();
            urlConnection.setConnectTimeout(2 * 1000);
            return urlConnection.getInputStream();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }


}

耗时操作

public class NetServiceTask extends AsyncTask<String, Void, Bitmap> implements Runnable {
    private String address;
    private URLPostHandler urlPostHandler = null;
    private ProgressBar progressBar;

    public NetServiceTask(String address, URLPostHandler urlPostHandler, ProgressBar progressBar) {
        this.address = address;
        this.urlPostHandler = urlPostHandler;
        this.progressBar = progressBar;
    }

    @Override
    protected Bitmap doInBackground(String... strings) {
        InputStream imageInputStream = NetWorkUtils.getImageInputStream(strings[0]);
        if (imageInputStream != null) {
            return BitmapFactory.decodeStream(imageInputStream);
        }
        return null;
    }

    @Override
    protected void onPostExecute(Bitmap result) {
        super.onPostExecute(result);
        progressBar.setVisibility(View.GONE);
        if (this.urlPostHandler != null && result != null) {
            this.urlPostHandler.PostHandler(result);
        }
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        progressBar.setVisibility(View.VISIBLE);
    }

    @Override
    public void run() {
        execute(this.address);
    }

    public interface URLPostHandler {
        void PostHandler(Bitmap bitmap);
    }
}

最后调用:

   NetServiceTask serviceTask = new NetServiceTask(defectDetail.fileLink, bitmap -> {
                    Bitmap copy = bitmap.copy(Bitmap.Config.ARGB_8888, true);
                    for (OrderDetailsResponse.DefectDetail.FileInfo fileInfo : defectDetail.photoUrl) {
                        int xmin = Math.round(fileInfo.xmin);
                        int xmax = Math.round(fileInfo.xmax);
                        int ymin = Math.round(fileInfo.ymin);
                        int ymax = Math.round(fileInfo.ymax);
                        if (null != copy) {
                            Rect rect = new Rect(xmin, ymax, xmax, ymin);
                            Canvas canvas = new Canvas(copy);
                            canvas.drawRect(rect, paint);
                            canvas.save();
                            canvas.restore();
                        }
                    }

                    saveImage(copy, imageFileName);

                }, progressBar);
                Thread thread = new Thread(serviceTask);
                thread.start();
            }

照片下载到本地目录代码:

        private void saveImage(Bitmap image, String fileName) {
            String saveImagePath = null;


            boolean success = true;
            if (!storageDir.exists()) {
                success = storageDir.mkdirs();
            }
            if (success) {
                File imageFile = new File(storageDir, fileName);
                saveImagePath = imageFile.getAbsolutePath();
                photoPath.add(saveImagePath);
                try {
                    OutputStream fout = new FileOutputStream(imageFile);
                    image.compress(Bitmap.CompressFormat.JPEG, 100, fout);
                    fout.close();

                } catch (Exception e) {
                    e.printStackTrace();

                }

            }
            Glide.with(mContext).load(saveImagePath).into(defectImage);
        }

最后效果:

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值