SQLite DB Blob字段与Android文件系统

时间:2013-12-19 15:12:46

标签: android image sqlite blob

这是引起一些头疼的事情,也许有人可以对这种情况有所了解。我正在使用Camera意图捕捉图片(好吧,真的是任意数量的图片),如下所示:

    ImageView imgPhoto = (ImageView)findViewById(R.id.imgButtonPhoto);
    imgPhoto.setBackgroundColor(Color.rgb(71,117,255));
    imgPhoto.setOnClickListener(new View.OnClickListener()
    {           
        @Override
        public void onClick(View v) 
        {   
            ++snapNumber; 

            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

            lastPicSaved = String.valueOf(gd.getDeliveryId()) + "_" + String.valueOf(snapNumber) + ".jpg";
            Uri imageUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(), lastPicSaved));             

            intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
            startActivityForResult(intent, GooseConsts.IMAGE_CAPTURE_INTENT);           
        }
    });

一旦活动结束,我就像这样抓住结果:

    case GooseConsts.IMAGE_CAPTURE_INTENT:
        try 
        {
            String newCompressedImage = Environment.getExternalStorageDirectory() + "/" + lastPicSaved;

            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inSampleSize = 4;   
            //options.inDensity = DisplayMetrics.DENSITY_MEDIUM;

            Bitmap b = BitmapFactory.decodeFile(newCompressedImage, options);
            FileOutputStream fos;

            fos = new FileOutputStream(newCompressedImage);
            b.compress(CompressFormat.JPEG, 60, fos);

            fos.flush();
            fos.close();

            Image i = new Image();
            i.setReported(0);
            i.setReportedFull(0);
            i.setImage(newCompressedImage);
            //i.setImageData(b);

            dbHelper.insertImageReference(i, gd.getDeliveryId());   
    }

真的很简单。正如您所看到的那样,我正在使用options.inSampleSize并在压缩时降低质量,以减小最终图像的大小,从而通过XMPP数据包保持较小的图像捕获以发送回hq。

这是有趣的部分! 在文件系统上,这个结果图像的大小约为50Kb,可能多一点但不超过60Kb。这很好,通过XMPP发送,我可以处理并在我也写过的自定义连接客户端中显示它。

我认为保留图像可能是最好的,以防因任何原因发送失败,但不希望它们在文件系统中丢失,因此向我的本地添加了BLOB字段设备数据库。我想知道我是否可以直接从所述数据库发送它们并完全取消文件系统,所以我尝试了,突然 NO 图像被我的客户机器人发送/接收。奇怪!经过一番挖掘后,我注意到已保存到数据库BLOB中的图像现在(惊人地)是原始图像的3倍。相同的尺寸(486x684)和相同的质量(因为我已经拉了一些来测试存储在SD卡上的那些)。

谁能告诉我为什么会这样呢?我多年来一直在使用BLOB字段,以前从未见过如此大幅度增加文件大小。肯定会有几个Kb,但不会从50(ish)Kb跳到160Kb以上?!

非常感谢。

1 个答案:

答案 0 :(得分:1)

压缩图像后,将Image转换为字节数组而不是使用blob

Bitmap b = BitmapFactory.decodeFile(newCompressedImage, options);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
b.compress(Bitmap.CompressFormat.PNG, 60, stream);
byte [] byteArray = stream.toByteArray();

这应该将文件大小保持在最低限度。当然,您必须将字节数组转换回位图以供显示。但这应该是直截了当的。

我相信字节数组有一个大小限制。将其初始化为

byte [] byteArray = new byte [1024];
// then
byteArray = stream.toByteArray();