imageview显示bitmap出现黑屏卡死的问题,就是调取摄像头,将获取的bitmap通过遍历找到出现最多的颜色,再将bitmap显示出来

慢慢来的小邵 2021-02-14 01:08:48
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.MediaStore;
import android.support.v4.content.FileProvider;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;

public class MainActivity extends Activity {
public static final int TAKE_PHOTO=1;
private ImageView picture;
private Uri ImageUri;
private Button takePhoto;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
picture=(ImageView) findViewById(R.id.picture);
takePhoto= (Button) findViewById(R.id.take_photo);
takePhoto.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//创建File对象,用于存储拍照后的图片
File outputImage=new File(getExternalCacheDir(),"outputImage.jpg");
try {
if (outputImage.exists()){
outputImage.delete();
}
outputImage.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
if (Build.VERSION.SDK_INT>=24){
ImageUri= FileProvider.getUriForFile(MainActivity.this,
"com.example.camerralbumtest.fileprovider",outputImage);
}else {
ImageUri=Uri.fromFile(outputImage);
}
//启动相机程序
Intent intent=new Intent("android.media.action.IMAGE_CAPTURE");
intent.putExtra(MediaStore.EXTRA_OUTPUT,ImageUri);
startActivityForResult(intent,TAKE_PHOTO);
}
});
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode){
case TAKE_PHOTO:
if (resultCode==RESULT_OK){
try {
//将拍摄的照片显示出来
Bitmap bitmap= BitmapFactory.decodeStream(getContentResolver().openInputStream(ImageUri));

int width = bitmap.getWidth();
int height = bitmap.getHeight();

// 保存所有的像素的数组,图片宽×高
int[] pixels = new int[width * height];

bitmap.getPixels(pixels, 0, width, 0, 0, width, height);
ArrayList<Integer> rgb=new ArrayList<Integer>();
for (int i = 0; i < pixels.length; i++) {
int clr = pixels[i];
int red = (clr & 0x00ff0000) >> 16; // 取高两位
int green = (clr & 0x0000ff00) >> 8; // 取中两位
int blue = clr & 0x000000ff; // 取低两位
Log.d("tag", "r=" + red + ",g=" + green + ",b=" + blue);
int color = Color.rgb(red, green, blue); //除去白色和黑色
if (color!=Color.WHITE && color!=Color.BLACK){
rgb.add(color);
}
}

HashMap<Integer,Integer> color2=new HashMap<Integer, Integer>();
for (Integer color:rgb){
if (color2.containsKey(color)){
Integer integer = color2.get(color);
integer++;
System.out.println(integer++);
color2.remove(color);
color2.put(color,integer);

}else{
color2.put(color,1);
}
}
//挑选数量最多的颜色
Iterator iter = color2.entrySet().iterator();
int count=0;
int color=0;
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry) iter.next();
int value = (Integer) entry.getValue();
if (count<value){
count=value;
color= (Integer) entry.getKey();
}

}
bitmap.eraseColor(color);

picture.setImageBitmap(bitmap);
System.gc();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
break;
default:
break;
}
}
}
蓝色这部分是挑出出现最多的颜色,去掉这段处理的话,拍的照片可以正常显示在imageview上但是一加上,真机就会黑屏卡死,刚接触android不太有经验,希望大家帮我一下
...全文
1179 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
abc4160201 2021-02-21
  • 打赏
  • 举报
回复
新手学习学习、、一起玩、、
  • 打赏
  • 举报
回复
xhzlhc 2021-02-19
  • 打赏
  • 举报
回复
进来学习一下
YXTS122 2021-02-18
  • 打赏
  • 举报
回复
搞不懂这个裁剪功能一去掉,程序马上报错了。好像在说拍完照后,要先进行裁剪,然后才能来选色。。。
慢慢来的小邵 2021-02-17
  • 打赏
  • 举报
回复
慢慢来的小邵 2021-02-17
  • 打赏
  • 举报
回复
package com.example.demo;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.FileProvider;
import android.os.Handler;
import android.os.Message;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.MediaStore;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;


import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Environment;
import android.provider.MediaStore;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class MainActivity extends AppCompatActivity {
    public static final int TAKE_PHOTO = 1;
    public static final int CROP_PHOTO = 2;
    private Button button = null;
    private ImageView imageview = null;
    private Uri imageUri = null;
    public void InitViews(){
        button =(Button)findViewById(R.id.take_photo);
        imageview =(ImageView)findViewById(R.id.picture);
    }
    public void InitEvents(){
        button.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                File file = new File(Environment.getExternalStorageDirectory(), "tempImage.jpg");
                try {
                    if (file.exists()) {
                        file.delete();
                    }
                    file.createNewFile();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                imageUri = Uri.fromFile(file);
                Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
                intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
                startActivityForResult(intent, TAKE_PHOTO); // 启动相机程序
            }
        });
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        InitViews();
        InitEvents();
    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (requestCode) {
            case TAKE_PHOTO:
                if (resultCode == RESULT_OK) {
                    Intent intent = new Intent("com.android.camera.action.CROP");
                    intent.setDataAndType(imageUri, "image/*");
                    intent.putExtra("scale", true);
                    intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
                    startActivityForResult(intent, CROP_PHOTO); // 启动裁剪程序
                }
                break;
            case CROP_PHOTO:
                if (resultCode == RESULT_OK) {
                    try {
                        String path = imageUri.getPath();
                        FileInputStream fis = new FileInputStream(path);
                        Bitmap mBitmap = BitmapFactory.decodeStream(fis);

                        int width = mBitmap.getWidth();
                        int height = mBitmap.getHeight();

                        // 保存所有的像素的数组,图片宽×高
                        int[] pixels = new int[width * height];

                        mBitmap.getPixels(pixels, 0, width, 0, 0, width, height);

                        ArrayList<Integer> rgb=new ArrayList<Integer>();
                        for (int i = 0; i < pixels.length; i++) {
                            int clr = pixels[i];
                            int red = (clr & 0x00ff0000) >> 16; // 取高两位
                            int green = (clr & 0x0000ff00) >> 8; // 取中两位
                            int blue = clr & 0x000000ff; // 取低两位
                            Log.d("tag", "r=" + red + ",g=" + green + ",b=" + blue);
                            int color = Color.rgb(red, green, blue);	                            //除去白色和黑色
                            if (color!=Color.WHITE && color!=Color.BLACK){
                                rgb.add(color);
                            }
                        }

                        HashMap<Integer,Integer> color2=new HashMap<Integer, Integer>();
                        for (Integer color:rgb){
                            if (color2.containsKey(color)){
                                Integer integer = color2.get(color);
                                integer++;
                                System.out.println(integer++);
                                color2.remove(color);
                                color2.put(color,integer);

                            }else{
                                color2.put(color,1);
                            }
                        }
                        //挑选数量最多的颜色
                        Iterator iter = color2.entrySet().iterator();
                        int count=0;
                        int color=0;
                        while (iter.hasNext()) {
                            Map.Entry entry = (Map.Entry) iter.next();
                            int value = (Integer) entry.getValue();
                            if (count<value){
                                count=value;
                                color= (Integer) entry.getKey();
                            }

                        }
                        Bitmap bitmap = Bitmap.createBitmap(width, height,Bitmap.Config.RGB_565);
                        bitmap.eraseColor(color);//填充颜色
                        imageview.setImageBitmap(bitmap); // 将裁剪后的照片显示出来
                    } catch (FileNotFoundException e) {
                        e.printStackTrace();
                    }
                }
                break;
            default:
                break;
        }
    }
}
由ADT变成了android studio ,用真机调试了下,加了一个裁剪功能,目前代码是可以运行的,就是时间很长,大概要9分钟就很头疼,所以黑屏的原因是因为执行oncreat()初始化函数运行时间过长,因为我遍历了bitmap太耗时了,导致一直无法显示界面,但是程序并没有出错,只是要等很久,这种情况下不显示黑屏,可以自己设置背景样式,具体可以看http://www.voidcn.com/article/p-wwiqynsu-n.html这篇,虽然程序没错了,但是性能太差了,打算用多进程或者多线程加快一下速度,还有记得回收bitmap,
慢慢来的小邵 2021-02-16
  • 打赏
  • 举报
回复
哇偶感激大佬至少我知道问题出在哪啦,等我换个开发环境接着改
YXTS122 2021-02-16
  • 打赏
  • 举报
回复
引用 2 楼 m0_44946030 的回复:
大佬抱歉,我的模拟器用不了摄像头,电脑好久也没连上真机,所以就没贴出日志,太菜了

我运行了你的代码,崩溃如下

我也不知道这个空指针怎么改
慢慢来的小邵 2021-02-15
  • 打赏
  • 举报
回复
大佬抱歉,我的模拟器用不了摄像头,电脑好久也没连上真机,所以就没贴出日志,太菜了
YXTS122 2021-02-15
  • 打赏
  • 举报
回复
黑屏卡死,把错误日志发出来让大家好发现错误啊

790

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 其他移动相关
社区管理员
  • 移动开发其他问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧