790
社区成员
发帖
与我相关
我的任务
分享
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,