android 位图和 opencv 垫 - 相同的代码不同的结果
android bitmap and opencv mat - Same code different outcome
我写的代码是这样的:
- 取一张位图
- 将其转换为 Mat
- 处理像素
- 将垫子转换为位图
此时我有两个分支。第一个将位图显示到 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));
谢谢
我通过这样更改 Mat 的初始化来设法解决问题:
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);
以便 OS 可以正确索引新文件,this SO answer
中有更多详细信息
我写的代码是这样的:
- 取一张位图
- 将其转换为 Mat
- 处理像素
- 将垫子转换为位图
此时我有两个分支。第一个将位图显示到 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));
谢谢
我通过这样更改 Mat 的初始化来设法解决问题:
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);
以便 OS 可以正确索引新文件,this SO answer
中有更多详细信息