画像の座標とビュー座標

画像(ビットマップ)座標 <-> デバイス(スクリーン)座標

この変換の方法だが、まずはiOSから。(androidは思い出すのにかなり時間がかかりそうだ)

iOSで画像を扱うフレームワークとしては画像データそのものを抽象化する低レベルのCoreGraphics(Quarz2D)、そしてGUIのツールキットであるUIKitがあり、今回はこの二つの間の座標を相互に変換してやれば良いはずだ。

UIKitは画像を扱う部分ではCoreGraphicsをラップしており、例えばUIImageではCGImageプロパティにアクセスすることでQuarz2Dで扱う画像を参照するCGImageRef構造体を取り出せる。
なので、UImage(View)上のタップした1点を指す座標に対応する画像の座標は以下のように求めることができる。

UIImage(View)上でタップされた点の座標(x, y)を内部画像の座標(x, y)に変換
-(CGPoint)coordinateForCGImage:(UIImageView*)imageView cordinate:(CGPoint)coordinate
{
    CGImageRef cgImage = imageView.image.CGImage;

    CGFloat imageWidth = CGImageGetWidth(cgImage);
    CGFloat imageHeight = CGImageGetHeight(cgImage);
    
    float scaleY = imageHeight / imageView.frame.size.height;
    float scaleX = imageWidth  / imageView.frame.size.width

    CGPoint result = CGPointMake(coordinate.x * scaleX, coordinate.y * scaleY);
    return result;
}

この逆(CGImageからUIImage)は同様に変換できるので省略する。

もっと良い方法があるような気がするが、今は思いつかない。