简体   繁体   English

为什么从图像字节数组开始,位图始终为空?

[英]Why the Bitmap is always null, from image byte array?

I have a problem and can not solve in my application. 我有一个问题,无法在我的应用程序中解决。 The application performs operations on images like PNG, the image is convert in a byte array , then a piece from this array of bytes is performed on bitwise operations , the problem is the new series of new bitmap format byte is always null. 应用程序对图像(如PNG)执行操作, 将图像转换为字节数组然后 对字节数组 的一部分进行按位运算 ,问题是新系列的新位图格式字节始终为null。 I just do not understand why the new bitmap, from new array byte, is always null and not know how to fix it this bug. 我只是不明白为什么来自新数组字节的新位图始终为null,并且不知道如何解决此错误。

// GetByte method from Image

private byte[] getByteImageData(String filePath) {
        /*
        Bitmap bitmap = BitmapFactory.decodeFile(filePath);
        Bitmap mutable = bitmap.copy(Bitmap.Config.RGB_565, true);
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        mutable.compress(Bitmap.CompressFormat.PNG, 100, baos);

    return baos.toByteArray();
        */


        byte[] _imagebytedata = new byte[1024];
        InputStream _input = null;

        try {
            if (filePath != null && (filePath.length() > 0)) {

                // Create a file for image
                File _fileimage = new File(filePath);

                if (_fileimage.exists()) {

                    // Get the byte from file image
                    _input = new BufferedInputStream(new FileInputStream(
                            _fileimage));
                    _imagebytedata = new byte[(int) _fileimage.length()];
                    _input.read(_imagebytedata, 0, (int) _fileimage.length());
                    _input.close();
                }
            }
        } catch (Exception e) {

        }

// Bitwise operations

private byte[] Text(byte[] imagedata, byte[] textmess, int offset) {


        for (int i = 0; i < textmess.length; ++i) {
            int add = textmess[i];

            for (int bit = 7; bit >= 0; --bit, ++offset) {
                int b = (add >>> bit) & 1;
                imagedata[offset] = (byte) ((imagedata[offset] & 0xFE) |b);
            }
        }
        return imagedata;
    }

//Save image from new byte array

private boolean saveImage(String pathFile,byte[] encodedimage) {

        OutputStream _output = null;
        File _newFileImage = new File(pathFile);
        byte[] _encodedimage = encodedimage;
        //Bitmap _imagebitmap = BitmapFactory.decodeByteArray(encodedimage, 0, encodedimage.length);

        if (_newFileImage.exists()) {
            try {

                _output = new BufferedOutputStream(new FileOutputStream(
                        _newFileImage));
                _output.write(_encodedimage, 0, _encodedimage.length);
                _output.flush();
                _output.close();
                return true;

            } catch (Exception e) {
            }
            ;

        }// _newFileImage.exists()
        return false;
    }


public  boolean encodeTextInFile(String filepath, String text) {

        byte[] _newimagebytedata;
        byte[] _imagebytedata = getByteImageData(filepath);
        byte[] _textbytedata = text.getBytes();
        byte[] _lengthbytedata = byteConversion(text.length());

         Bitmap _bitmapunu = BitmapFactory.decodeByteArray(_imagebytedata, 0, _imagebytedata.length);            
        _newimagebytedata = Text(_imagebytedata, _lengthbytedata, 33);
        Bitmap _bitmapdoi = BitmapFactory.decodeByteArray(_newimagebytedata, 0, _newimagebytedata.length);
        // The value of variable _bitmapdoi is null
        _newimagebytedata = Text(_imagebytedata, _textbytedata, 65);

        return saveImage(filepath, _newimagebytedata);
    }

It looks as if you are trying to encode a text message in the lower bits of the image (if I understand your code correctly). 好像您正在尝试在图像的低位编码文本消息(如果我正确理解您的代码)。 I actually used this as a christmas card for fellow geeks this year. 我今年实际上将其用作其他极客的圣诞贺卡。

However, when you create Text you encode the text into the byte[] of the image file thus probably destroying the image (unless you are very lucky). 但是,在创建Text时,会将文本编码到图像文件的byte []中,从而可能会破坏图像(除非您非常幸运)。 You probably want your addition of the text bytes to be on the decoded image (Bitmap _bitmapunu). 您可能希望添加文本字节在解码图像上(Bitmap _bitmapunu)。

The javadoc for Bitmap.decodeByteArray says that it will return null if the image can not be decoded. Bitmap.decodeByteArray的javadoc说,如果无法解码图像,它将返回null。

This is what you need to do: 这是您需要做的:

  1. Read the image bytes from the file, say fileArray. 从文件读取映像字节,例如fileArray。
  2. Decode the fileArray into actual pixels, imageArray 将fileArray解码为实际像素imageArray
  3. Manipulate the pixels in imageArray 操纵imageArray中的像素
  4. Encode the pixels into a image format again (such as png), say newFileArray. 再次将像素编码为图像格式(例如png),例如newFileArray。
  5. Store the newFileArray to a file. 将newFileArray存储到文件中。

What you seem to be doing is trying to manipulate the bytes in fileArray directly, thus breaking the file format and making it impossible to decode the bytes into pixels. 您似乎正在做的是尝试直接操作fileArray中的字节,从而破坏了文件格式,并且无法将字节解码为像素。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM