Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/215.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:将图像压缩并插入SQLite数据库_Android_Image_Sqlite_Compression_Blob - Fatal编程技术网

Android:将图像压缩并插入SQLite数据库

Android:将图像压缩并插入SQLite数据库,android,image,sqlite,compression,blob,Android,Image,Sqlite,Compression,Blob,我正在开发一个应用程序,在这个应用程序中,我需要以BLOB格式存储1600多个图像.PNG。每个图像的大小接近230KB 我想做的是将图像压缩到20KB以下。因此,整个图像大小将约为32 MB 1600 x 20KB,最终apk大小将减小 进一步解释:我想做的是将图像从230KB压缩到20KB以下,以节省数据库中的更多空间。在将其集成到apk中之前,数据库将充满数据和图像 所以,如果我压缩存储在数据库中的图像。数据库大小将减少。而且在APK内部不会占用很多空间 有什么建议吗 注意:在集成到应用程

我正在开发一个应用程序,在这个应用程序中,我需要以BLOB格式存储1600多个图像.PNG。每个图像的大小接近230KB

我想做的是将图像压缩到20KB以下。因此,整个图像大小将约为32 MB 1600 x 20KB,最终apk大小将减小

进一步解释:我想做的是将图像从230KB压缩到20KB以下,以节省数据库中的更多空间。在将其集成到apk中之前,数据库将充满数据和图像

所以,如果我压缩存储在数据库中的图像。数据库大小将减少。而且在APK内部不会占用很多空间

有什么建议吗


注意:在集成到应用程序之前,数据库将充满信息。

我认为最好将这些图像存储在服务器上,一旦用户下载了你的应用程序,你应该将图像传输到应用程序。
1600对于尚未安装的应用程序来说确实是一个很大的数字…

我不知道这是否是使用SQLite节省存储空间的最佳方式,我仍在寻找它,但我们开始了

您可以选择图像的来源,如图库或照相机,下面是代码

private void selectProductImage() {
        final CharSequence[] itens = {"Use Camera", "Gallery", "Cancel"};

        AlertDialog.Builder builder = new AlertDialog.Builder(this,R.style.AlertDialog);
        builder.setItems(itens, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                if (itens[which].equals("Use Camera")) {
                    Toast.makeText(YourActivity.this, "Use Camera", Toast.LENGTH_SHORT).show();
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                        requestPermissions(new String[]{Manifest.permission.CAMERA}, MY_CAMERA_PERMISSION_CODE);
                    } else {
                        Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                        startActivityForResult(cameraIntent, CAMERA_REQUEST);
                    }

                } else if (itens[which].equals("Gallery")) {
                    Toast.makeText(YourActivity.this, "Gallery", Toast.LENGTH_SHORT).show();
                    Intent galleryIntent = new Intent();
                    galleryIntent.setAction(Intent.ACTION_GET_CONTENT);
                    galleryIntent.setType("image/*");
                    startActivityForResult(galleryIntent, REQUEST_GALLERY_PHOTO);

                } else if (itens[which].equals("Cancel")) {
                    dialog.dismiss();
                }
            }
        });
        builder.show();
    }
也许你需要许可才能使用相机

@Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        if (requestCode == MY_CAMERA_PERMISSION_CODE) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                //Toast.makeText(this, "camera permission granted", Toast.LENGTH_LONG).show();
                Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
                startActivityForResult(cameraIntent, CAMERA_REQUEST);
            } else {
                Toast.makeText(this, "camera permission denied", Toast.LENGTH_LONG).show();
            }
            return;
        }

    }
下面是如何处理来自所选源的图像

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == CAMERA_REQUEST && resultCode == Activity.RESULT_OK) {
        Bitmap bitmap = Bitmap.createScaledBitmap((Bitmap) data.getExtras().get("data"),96, 96, true);
        mProductImage.setImageBitmap(bitmap);
        isPriviteImage = true;
    }

    if (requestCode == REQUEST_GALLERY_PHOTO && resultCode == RESULT_OK && data != null) {
        //mProductImage.setImageURI(data.getData());

        // INSERT IMAGE INTO SQLite
        Uri uri = data.getData();

        try {
            InputStream inputStream = getContentResolver().openInputStream(uri);
            Bitmap bitmap = Bitmap.createScaledBitmap(BitmapFactory.decodeStream(inputStream),96, 96, true);
            mProductImage.setImageBitmap(bitmap);
            isPriviteImage = true;
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }

}
正如您在我的示例中所注意到的,您选择了camera,而我将图像放置在名为MPProductImage的ImageView变量上,因此没有保存图像的位置

从现在起,您可以使用按钮将图像保存到SQLite数据库中。这是您可以使用的函数

private void saveImage() {

    productTablePath = Environment.getExternalStorageDirectory()+"/YourAditionalPath/";

    ProductDatabaseHelper productDatabaseHelper = new ProductDatabaseHelper(getApplicationContext(), "dbname.db", productTablePath);
    productListTable = productDatabaseHelper.getWritableDatabase();
    productRepository = new ProductRepository(productListTable);

    try {

        if (isPriviteImage) {
            productRepository.addProduct(imageViewToByte(mProductImage));
            isPriviteImage = false;

        } else {
            productRepository.addProduct(null);

        }

        mProductImage.setImageResource(R.drawable.shopping_cart_black_48dp);
    } catch (Exception e) {
        e.printStackTrace();
    }

}
其中imageViewToByte函数为:

private byte[] imageViewToByte(CircleImageView image) {
    Bitmap bitmap = ((BitmapDrawable)image.getDrawable()).getBitmap();
    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.PNG,100,stream);
    byte[] byteArray = stream.toByteArray();
    return byteArray;
}
现在需要实现SQLiteOpenHelper。您需要为此创建一个新类。我在这里使用的java文件名是ProductDatabaseHelper.java

现在您需要实现CRUD创建新项、读取、更新和删除

public class ProductRepository {

    SQLiteDatabase instance;

    public ProductRepository(SQLiteDatabase instance) {
        this.instance = instance;
    }

    public void addProduct(byte[] image){

        ContentValues contentValues = new ContentValues();

        contentValues.put("IMAGE",image);

        instance.insertOrThrow("PRODUCTLIST",null, contentValues);
    }


}
值得一提的是,源图像照相机和gallery的图像压缩都是在onActivityResult中进行的

使用命令:

Bitmap bitmap = Bitmap.createScaledBitmap(capturedImage, width, height, true);
除此之外,这里还有一个链接,我们可以从中了解一些有关压缩的信息


如果您有更好的压缩图像以保存在SQLite数据库中的方法,请在此处发布您的代码

这样做有什么问题?将图像放入数据库与apk甚至apk的大小有什么关系?连接在哪里?你如何整合它?我做了一个更新。我仍然不知道数据库会在你的apk里的什么地方。我仍然不明白你想要的东西有哪些问题。@greenapps数据库通常存在于apk内的Assets文件夹中。如果您曾经将预填充数据库集成到APK中,您就会知道我在说什么。
Bitmap bitmap = Bitmap.createScaledBitmap(capturedImage, width, height, true);