Android:从SD卡调整JPEG大小而不会降低质量

时间:2015-10-04 10:17:30

标签: android bitmap resize jpeg

通常我会使用StackO的搜索功能找到所需的一切。但是现在(成功更少)我真的很努力地从SD卡调整JPEG大小而不会降低质量。如下所示,您可以看到原始图像干净且完全可读。调整大小后,我总会得到模糊的结果。

原文:https://www.dropbox.com/s/l5h4cdkz29vkapw/signature.jpg?dl=0

缩放:https://www.dropbox.com/s/tobijbu5hisf9rz/signature_small.jpg?dl=0

在下面的代码段落中,您可以看到我尝试过的所有内容都没有成功(我希望我错了,但我认为这段文章包含了StackO的所有可用答案。):

 public void saveSignature(View view) throws IOException {
    image = signature.getImage();
    File sd = Environment.getExternalStorageDirectory();
    File final_location = new File(sd, "signature.jpg");

    try {
        if (sd.canWrite()) {
            final_location.createNewFile();
            OutputStream os = new FileOutputStream(final_location);

            image.compress(Bitmap.CompressFormat.JPEG, 100, os);
            os.close();

            //Bitmap resized = Bitmap.createScaledBitmap(image,(int)(image.getWidth()*0.4),(int)(image.getHeight()*0.4), false);
            //Bitmap resized = Bitmap.createScaledBitmap(image, 300,75, false);

            BitmapFactory.Options bmOptions = new BitmapFactory.Options();

            // "works but Color ist gray from sampling" bmOptions.inSampleSize = 5;

            final_location = new File(sd, "signature_small.jpg");
            final_location.createNewFile();
            os = new FileOutputStream(final_location);

            Bitmap b= BitmapFactory.decodeFile(sd +"/signature.jpg",bmOptions);
            Bitmap out = Bitmap.createScaledBitmap(b, 349, 86, true); //also tyed false (without any Change)

            out.compress(Bitmap.CompressFormat.JPEG, 100, os);
            os.close();
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

获得Android(4.0及更高版本)样本的答案或链接会很不错。

感谢您的帮助, 强硬!!

1 个答案:

答案 0 :(得分:0)

您如何在不降低质量的情况下缩小图像尺寸?

无论如何,为了正确缩小你需要首先模糊图像,最好使用Gaussian内核,但是盒子模糊可能会很好。内核大小应与您希望缩放的比例相匹配。之后,您可以使用任何插值技术缩小图像。 Lanzcosbilinear甚至nearest neighbor都足够好了。另一种方法是使用某种区域采样,其中目标图像中的每个像素是源图像中像素区域的平均值。另一种方法是使用某种supersampling

如果你不做任何这些,你最终会得到糟糕的图像。但即使你做得正确,你也会失去品质。因为按比例缩小的图像将比原始图像具有更少的信息。