Search code examples
javaandroidbitmaparraysscale

Why i cannot show my byte[] image after converting it from bitmap?


I'm trying to write a method that accepts an image(Bitmap) and returns a byte[] array. finally, I try to write this byte[] array to a folder so I can see the difference, but my byte[] arraycan not displayed, and in addition, it is not scaled down! This is my method:

private byte[] changeSize(Bitmap image) {
        byte[] picture;
        int width = image.getWidth();
        int height = image.getHeight();
        int newHeight = 0, newWidth = 0;
            if (width > 250 || height > 250) {
                    if (width > height) { //landscape-mode
                        newHeight = 200;
                        newWidth = (newHeight * width) / height;
                    } else { //portrait-mode
                        newWidth = 200;
                        newHeight = (newWidth * height) / width;
                    }
                } else {
                    Toast.makeText(this, "Something wrong!", Toast.LENGTH_LONG).show();
                }
        Bitmap sizeChanged = Bitmap.createScaledBitmap(image, newWidth, newHeight, true);
        //Convert bitmap to a byte array
        int bytes = sizeChanged.getByteCount(); 
        ByteBuffer bb = ByteBuffer.allocate(bytes); 
        sizeChanged.copyPixelsFromBuffer(bb); 
        picture = bb.array();
        //Write to a hd
        picturePath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
        String fileName = edFile.getText().toString() + "_downscaled" + ".jpg";
        File file = new File(picturePath, fileName);
        FileOutputStream fos = null;
        try {
            fos = new FileOutputStream(file);
            fos.write(picture);
            fos.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return image;
} 

I tried several hours to get my byte[] array visible, but I could simply not do this. Any help or hints to show me where I derail is/are very appreciated.


Solution

  • This was working for me

    public static Bitmap byteArraytoBitmap(byte[] bytes) {
        return (BitmapFactory.decodeByteArray(bytes, 0, bytes.length));
    }
    
    public static byte[] bitmaptoByteArray(Bitmap bmp) {
        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        bmp.compress(Bitmap.CompressFormat.PNG, 100, stream); //PNG format is lossless and will ignore the quality setting!
        byte[] byteArray = stream.toByteArray();
        return byteArray;
    }
    
    public static Bitmap bitmapFromFile(File file) {
        //returns null if could not decode
        return BitmapFactory.decodeFile(file.getPath());
    }
    
    public static boolean saveImage(Bitmap image, String filePath) {
        LogInfo(TAG, "Saving image to: " + filePath);
        File file = new File(filePath);
        File fileDirectory = new File(file.getParent());
        LogInfo(TAG, fileDirectory.getPath());
    
        if (!fileDirectory.exists()) {
            if (!fileDirectory.mkdirs()) {
                Log.e(TAG, "ERROR CREATING DIRECTORIES");
                return false;
            }
        }
    
        try {
            file.createNewFile();
            FileOutputStream fo = new FileOutputStream(file);
            fo.write(bitmaptoByteArray(image));
            fo.flush();
            fo.close();
            return true;
        }
        catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    
    }