读取和写入图像后,我得到不同的像素值

时间:2016-07-15 08:28:35

标签: android image-processing android-bitmap

我在这里遇到了很多问题。

当我读取图像然后保存它时,我得到了相同的图片。但是当我打开像素值时,每个像素的值略有不同(大约10个单位的大小)。

为什么这个像素会改变?我只读取图像,然后保存,我不会对像素进行更改。我使用 RGB 格式创建它,并使用 ByteArrayOutputStream 方法保存为 PNG

private void onCaptureImageResult(Intent data) {
    Bitmap thumbnail = (Bitmap) data.getExtras().get("data");
    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    thumbnail.compress(Bitmap.CompressFormat.JPEG, 90, bytes);

    File destination = new File(Environment.getExternalStorageDirectory(),
            System.currentTimeMillis() + ".jpg");

    FileOutputStream fo;
    try {
        destination.createNewFile();
        fo = new FileOutputStream(destination);
        fo.write(bytes.toByteArray());
        fo.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    ivImage.setImageBitmap(thumbnail);
}

private void onSelectFromGalleryResult(Intent data) {

        Bitmap bm=null;
        if (data != null) {
            try {
                bm = MediaStore.Images.Media.getBitmap(getApplicationContext().getContentResolver(), data.getData());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        bmp = bm;
    }

public void save(View view){
    operation= Bitmap.createBitmap(bmp.getWidth(), bmp.getHeight(),bmp.getConfig());
    int size = bmp.getRowBytes() * bmp.getHeight();
    bytearrayoutputstream = new ByteArrayOutputStream();
    int[] gambarR = new int[size];
    int[] gambarG = new int[size];
    int[] gambarB = new int[size];
    int[] gambarA = new int[size];
    int k = 0;

    for(int i=0; i<bmp.getWidth(); i++){
        for(int j=0; j<bmp.getHeight(); j++){
            int p = bmp.getPixel(i, j);
            gambarR[k] = Color.red(p);
            gambarG[k] = Color.green(p);
            gambarB[k] = Color.blue(p);
            gambarA[k] = Color.alpha(p);
            k++;
        }
    }
    int l = 0;

    for(int i = 0; i<bmp.getWidth(); i++){
        for(int j = 0; j<bmp.getHeight();j++){
            operation.setPixel(i, j, Color.rgb(gambarR[l], gambarG[l], gambarB[l]));
            l++;
        }
    }
    String fileName = "_hasil.bmp";
    Long tsLong = System.currentTimeMillis()/1000;
    String ts = tsLong.toString();
    String baseDir = Environment.getExternalStorageDirectory().getAbsolutePath();
    File gambar = new File(baseDir + File.separator + ts + fileName);
    try
    {
        gambar.createNewFile();
        fileoutputstream = new FileOutputStream(gambar);
        fileoutputstream.write(bytearrayoutputstream.toByteArray());
        fileoutputstream.close();

    }
    catch (Exception e)
    {
        e.printStackTrace();

    }

    ivImage.setImageBitmap(operation);
}

我会告诉你图像之间的区别。我只阅读并保存,并且不会更改像素。我需要在保存时不改变像素。

this is the difference between the pixel of the image.

1 个答案:

答案 0 :(得分:1)

正如其他人所注意到的那样,您发布的大部分代码似乎没有多大用处,表明您要么没有阅读文档,要么没有彻底仔细考虑过这个问题。

但是,具体问题似乎是您以有损压缩格式(JPEG)保存图像,在这种情况下,质量为90%。 &#34;有损&#34;意味着根据定义,您将永远无法获得压缩之前的位图。即使将JPEG质量设置为100%也不太可能获得与压缩前完全相同的位图。

如果您在阅读文件时想要完全相同的值,则需要编写无损格式,例如PNG或BMP。