ステータスバーのバッテリーアイコン付近の色情報を取得してみた

ステータスバーのバッテリーアイコン付近の色情報(RGBA)を取得する必要があって、そのときに書いたコード。
処理的にはスクリーンキャプチャしたCGImageから対象の領域を1pxにトリミングして、そこからRGBA情報を取得するというもの。

using System;
using System.Drawing;
using MonoTouch.UIKit;
using MonoTouch.CoreGraphics;



CGImage screenImage;
CGImage captureImage;

screenImage = CGImage.ScreenImage;
float width = screenImage.Width;
float height = screenImage.Height;

switch (UIDevice.CurrentDevice.Orientation)
{
  case UIDeviceOrientation.LandscapeLeft:
    captureImage = screenImage.WithImageInRect(new RectangleF(width - 4, height - 4, 1, 1));
    break;
  case UIDeviceOrientation.PortraitUpsideDown:
    captureImage = screenImage.WithImageInRect(new RectangleF(4, height - 4, 1, 1));
    break;
  case UIDeviceOrientation.LandscapeRight:
    captureImage = screenImage.WithImageInRect(new RectangleF(4, 4, 1, 1));
    break;
  default:
    captureImage = screenImage.WithImageInRect(new RectangleF(width - 4, 4, 1, 1));
    break;
}

CGDataProvider dataProv = captureImage.DataProvider;

byte r;
byte g;
byte b;
byte a;
unsafe
{
  IntPtr intPtr = dataProv.CopyData().Bytes;
  byte* byteData = (byte*)intPtr;
  r = byteData[0];
  g = byteData[1];
  b = byteData[2];
  a = byteData[3];
  Console.WriteLine("r={0}, b={1}, b={2}, a={3}", r, g, b, a);
}

画像データのビットマップ情報に直接アクセスできるメソッドやプロパティはないようで、unsafeなコードでポインタ上から直接RGBAの情報にアクセスしなければならなかった。