Creating a "compatible" image is just something you have to do so that the JVM knows that the image should be a managed image. Here's my method for doing it:
public static BufferedImage createImage(final int width, final int height,
final boolean shouldTransparencyBeAllowed)
GraphicsConfiguration graphicsConfiguration = GraphicsEnvironment.
return graphicsConfiguration.createCompatibleImage(width, height,
shouldTransparencyBeAllowed ? Transparency.BITMASK : Transparency.OPAQUE);
Then you just need to draw the image you loaded to the image returned by the createImage method.
As you can see, it's not anything difficult, and it's something that doesn't seem like it should have to be done at all. I don't know why images aren't "compatible" by default, but that's just the way it is. It's a small price to pay for not having to write your own graphics library.