So I have an app on Google Glass that takes a picture, then converts it to grayscale and overwrites the original image in memory:
private void rGBProcessing (final String picturePath, Mat image) {
//BitmapFactory Creates Bitmap objects from various sources,
//including files, streams, and byte-arrays
Bitmap myBitmapPic = BitmapFactory.decodeFile(picturePath);
image = new Mat(myBitmapPic.getWidth(), myBitmapPic.getHeight(), CvType.CV_8UC4);
Mat imageTwo = new Mat(myBitmapPic.getWidth(), myBitmapPic.getHeight(), CvType.CV_8UC1);
Utils.bitmapToMat(myBitmapPic, image);
Imgproc.cvtColor(image, imageTwo, Imgproc.COLOR_RGBA2GRAY);
Utils.matToBitmap(imageTwo, myBitmapPic);
FileOutputStream out = null;
try {
out = new FileOutputStream(picturePath);
myBitmapPic.compress(Bitmap.CompressFormat.PNG, 100, out);
// PNG is a lossless format, the compression factor (100) is ignored
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (out != null) {
out.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
The grey bitmap is not fully visible in memory using Windows Photo Viewer until the Google Glass is unplugged from the debugging computer and then plugged back in. Sometimes half of the grayscale image can be viewed but that's it. I altered the code to show the image rather than save it into internal memory and this was quick and successful which makes me think that the problem is with reading the grayscale image into internal memory:
FileOutputStream out = null;
try {
out = new FileOutputStream(picturePath);
myBitmapPic.compress(Bitmap.CompressFormat.PNG, 100, out);
// PNG is a lossless format, the compression factor (100) is ignored
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (out != null) {
out.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
Any explanations or suggestions welcome. Thanks.
MediaScannerConnection
andscanFile()
to get the file indexed by theMediaStore
. "Sometimes half of the grayscale image can be viewed but that's it" --callgetFD().sync()
on theFileOutputStream
after you callflush()
but before you callclose()
. – Itin