ImageIO.read fails to read ByteArrayInputStream for image

Unlike python2, jython is more like python3 when dealing with byte arrays. Assigning bytes to a string type will “decode” the bytes into 16-bit unicode characters. Fragments of your array are being extended to 16-bits and fragments that make a valid unicode sequence (probably intepreted as utf8) are being expressed directly. Nearly doubling the size is the natural result.
You simply cannot use a String custom property to hold your raw bytes. Technically, you need a property with java type “array of bytes”. The properties customizer doesn’t offer that data type, but you can programmatically create one in the designer. This isn’t documented and if you store anything in a property that doesn’t serialize, you can break your project and the designer. This post and the this follow-up post might help you.
I personally wouldn’t use abishur’s suggestion, as there’s an awful lot of data manipulation going on in repaint events – events that need to be blistering fast and really should not reference anything outside the component.