在SQL中保存裁剪的图像

时间:2016-06-07 14:02:29

标签: android sqlite photo

我想在BLOB字段中的SQL数据库中保存照片。现在我正在保存一个字节数组,但是应用程序的工作量太大了...我改变了尺寸(BitmapFactory)以减少应用程序的工作,但是图像是一种镶嵌而且缺乏分辨率。实际上我正在用相机拍照并希望保存并在我的数据库和应用程序中使用。我知道最好在DB中保存我的文件路径(可能是外部SD卡)并在我的应用程序中检索我需要的图像,但是我找不到明确的教程来做到这一点。无论如何,我想保存我拍摄的裁剪版本,以节省更多内存。您是否有任何明确的教程可以分享,或者有关使用代码的任何建议...提前谢谢

1 个答案:

答案 0 :(得分:0)

试试这个

 private void selectImage() {

        final CharSequence[] options = { "Take Photo", "Choose from Gallery","Cancel" };

        AlertDialog.Builder builder = new AlertDialog.Builder(ProfileSettings.this);
        builder.setTitle("Profile Picture!");
        builder.setItems(options, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int item) {
                if (options[item].equals("Take Photo")) {
                    Intent takePicture = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                    startActivityForResult(takePicture, TAKEPIC);
                } else if (options[item].equals("Choose from Gallery")) {
                    Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                    startActivityForResult(intent, PICKPIC);

                } else if (options[item].equals("Cancel")) {
                    dialog.dismiss();
                }
            }
        });
        builder.show();
    }


     @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if(resultCode==RESULT_OK)
        {
            if(requestCode==TAKEPIC)
            {
                Bitmap bitmap=(Bitmap) data.getExtras().get("data");
                Uri selectedImage =getImageUri(YOURACTIVITY.this,bitmap);

                String localimagepath =getImagePath(YOURACTIVITY.this, selectedImage);


            }
            else if(requestCode==PICKPIC)
            {
                Uri selectedImage = data.getData();

                String localimagepath = getImagePath(YOURACTIVITY.this, data.getData());

            }
        }
    }
    public Uri getImageUri(Context inContext, Bitmap inImage) {
        ByteArrayOutputStream bytes = new ByteArrayOutputStream();
        inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
        String path = MediaStore.Images.Media.insertImage(inContext.getContentResolver(), inImage,"title",null);
        return Uri.parse(path);
    }


    public  String getImagePath(Context context,Uri uri) {
        String[] projection = { MediaStore.Images.Media.DATA };

        Cursor cursor =context.getContentResolver().query(uri,projection,null,null,null); //managedQuery(uri, projection, null, null, null);
        if(cursor!=null) {
            int column_index = cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA);
            cursor.moveToFirst();
            return cursor.getString(column_index);
        }
        else return null;
    }


    public void saveImagePath(String imagePath)
    {
      //push image path to db
      DBHelpher dbHelpher=new DBHelpher(YOURACTIVITY.this);
      dbHelpher.insertImagePath(imagePath);
    }

为sqlite创建类以在数据库中保存图像路径

public class DBHelpher extends SQLiteOpenHelper 
{

 Context context;
    public final String TABLE_SAMPLE="test";
      public final String COLUMN_ID="id";
    public final String COLUMN_IMAGEPATH="imagepath";

    public final String CREATE_TABLE__SAMPLE_SQL="create table " + TABLE_SAMPLE
            + " (" + COLUMN_ID + " integer primary key autoincrement, "
            + COLUMN_IMAGEPATH + " text "
            + ");";


    public DBHelpher(Context context)
    {
        super(context, "DATABASENAME.db", null, 1);
        this.context=context;
    }

    @Override
    public void onCreate(SQLiteDatabase db) {

        db.execSQL(CREATE_TABLE__SAMPLE_SQL);


    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }


    public void insertImagePath(String imagePath)
    {

        SQLiteDatabase database = this.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put(COLUMN_IMAGEPATH,imagePath);
         database.insert(TABLE_SAMPLE, null, values);


    }


}

从您想要拍照的地方调用selectImage方法。

相关问题