My thought was that maybe some sufficiently-weird arithmetic with the pointer value could cause it to round down the source address for the copy to before the start of the image data.
The odd part is, this works perfectly fine for the built-in icon I tested it with above, and the same method works for taking a screenshot on Windows. So it either has something to do with the buffer, or with the icon. (Perhaps it has something to do with it being extracted from an executable?)