android位图和opencv mat - 相同的代码不同的结果

时间:2016-07-01 12:11:01

标签: java android opencv android-bitmap mat

我写的代码就像这样:

  1. 采取位图
  2. 将其转换为Mat
  3. 处理像素
  4. 将Mat转换为位图
  5. 此时我有两个分支。第一个将位图显示在ImageView中,第二个将位图保存在磁盘上,然后然后将位图显示到ImageView中。 尽管使用相同的代码,我还是面临着不同的行为。我希望保存位图以保留颜色,就像第一种情况一样。 这是我使用的代码:

    srcBitmap = ImageResizer.decodeSampledBitmapFromFile(imagePath,1024,1024,null);
    
    src = new Mat(srcBitmap.getHeight(),srcBitmap.getWidth(),CvType.CV_8UC4);
    dst = new Mat(srcBitmap.getHeight(),srcBitmap.getWidth(),CvType.CV_8UC4);
    
    Utils.bitmapToMat(srcBitmap,src);
    Utils.bitmapToMat(srcBitmap,dst);
    
    double[] rgb;
    for(i=0; i<src.height(); i++){
        for(j=0; j<src.width(); j++){
            rgb = src.get(i,j);
    
            r = rgb[0];
            g = rgb[1];
            b = rgb[2];
            a = rgb[3];
            .
            .
            .
            dst.put(i,j, r, g, b,a);
            }
    }
    
    Bitmap dstBitmap = Bitmap.createBitmap(srcBitmap.getWidth(),srcBitmap.getHeight(),Bitmap.Config.ARGB_8888);
    Utils.matToBitmap(dst,dstBitmap);
    

    第一种情况:只显示位图

    imageView = (ImageView) findViewById(R.id.bitmap_preview);                
    imageView.setImageBitmap(dstBitmap);
    

    第二种情况:保存位图并显示

    File newFile = fileHandler.getOutputMediaFile(FileHandler.MEDIA_TYPE_IMAGE);
    FileOutputStream out = null;
    try {
        out = new FileOutputStream(newFile);
        destBitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
        out.flush();
        out.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    imageView = (ImageView) findViewById(R.id.bitmap_preview);                
    imageView.setImageBitmap(ImageResizer.decodeSampledBitmapFromFile(fileHandler.getUriFromFile(newFile).getPath(),1024,1024,null));
    

    谢谢

1 个答案:

答案 0 :(得分:1)

我设法通过这种方式更改Mat的inizialization来解决问题:

    src = new Mat(bufferBitmap.getHeight(),bufferBitmap.getWidth(),CvType.CV_8U, new Scalar(4));
    dst = new Mat(bufferBitmap.getHeight(),bufferBitmap.getWidth(),CvType.CV_8U, new Scalar(4));

修改

保存文件后,请务必致电

MediaScannerConnection.scanFile(getActivity(), new String[]{file.toString()}, null, null);

因此操作系统可以正确索引新文件,更多详细信息请参见this SO answer