I think all methods you mention are not really different.
The method I've used I think is exactly the same as pixel perfect touch, didn't really check, but it uses method 1 and 2 that you mention in a way :
1. get the bitmap after its loaded but before its turned into a texture , if you're using the asset manager you can extend it and store the data needed there.
from that bitmap, use BitmapData.getPixels(), and then just let the texture be created from the bitmap and be disposed. So I just intercept the bitmap, whether it be embedded or loaded in the first place, before it becomes a texture.
2. from that vector of uints, you can check transparent pixels. if you want some threshold and allow partially transparent pixels to be clickable, then process this, I created a bytearray I think, where each position was equivalent to an index in the vector of 'pixels' and I'd set the value to true/false for clickable/not clickable depending on my threshold value. then I'd dispose the vector of uints.
3. I have a special image class done, which will use that data in an overriden hitTest function, simply check the position I touched in 2D , transform it to a 1D position to get the corresponding value in my bytearray of bools and just check if the value is true or false... and react accordingly.
I didn't check the extension a lot, I think that's how its done though.
I needed a "threshold" parameter because my images had a bit of blur or shadow, and wanted to be able to click 80% opaque pixels, that's the reason why I wanted to pre-process that and store only true/false instead of using the pixel data every time.Also it seems keeping a bytearray instead of a vector helps in performance and memory.
To use less memory you could have one value in the bytearray be used for 4 pixels - as if you divided the size of the image to test against by 2, or you could downsample (I don't know if that term is appropriate here) even more, depends on the touch precision you're looking for.