Xamarin.Macで画素配列からCGImageを生成する

提供: MonoBook
2017年8月21日 (月) 07:31時点におけるimported>Administratorによる版 (ページの作成:「勉強がてらJPEGのコーデックをC#で実装してみているのだが、デコード済みの画素データが格納されたbyte配列からCGImageを生成し...」)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
ナビゲーションに移動 検索に移動

勉強がてらJPEGのコーデックをC#で実装してみているのだが、デコード済みの画素データが格納されたbyte配列からCGImageを生成したい。

RGB画像

RGBなのでコンポーネント数は3で問題ないと思う。

        public static CGImage CreateImage()
        {
            var colorSpace = CGColorSpace.CreateDeviceRGB();
            var width = 512;
            var height = 512;
            var bitsPerSample = 8;
            var components = 3;//RGB
            var bitsPerPixel = bitsPerSample * components;
            var bytesPerRow = bitsPerPixel / 8 * width;
            var buffer = new byte[width * height * components];

            int a = 0;
            for (int y = 0; y < height; y++)
            {
                for (int x = 0; x < width; x++)
                {
                    var c = (byte)((1 << bitsPerSample) * ((float)y / width));
                    buffer[a++] = c;
                    buffer[a++] = 0;
                    buffer[a++] = 0;
                }
            }

            var data = new CGDataProvider(buffer);
            var cgImage = new CGImage(
                width,
                height,
                bitsPerSample,
                bitsPerPixel,
                bytesPerRow,
                colorSpace,
                CGBitmapFlags.ByteOrderDefault,
                data,
                decode: null,
                shouldInterpolate: false,
                intent: CGColorRenderingIntent.Default);

            return cgImage;
        }

インデックスカラー画像

ついでにインデックスカラーも試してみた。

        public static CGImage CreateIndexedImage()
        {
            var colors = new byte[] {
                  0, 0, 0,
                 63, 0, 0,
                127, 0, 0,
                191, 0, 0,
                255, 0, 0
            };
            var colorSpace = CGColorSpace.CreateIndexed(CGColorSpace.CreateDeviceRGB(), colors.Length / 3, colors);

            var width = 512;
            var height = 512;
            var bitsPerSample = 8;
            var components = 1;// Indexed Color

            var bitsPerPixel = bitsPerSample * components;
            var bytesPerRow = bitsPerPixel / 8 * width;
            var buffer = new byte[width * height * components];

            int a = 0;
            for (int y = 0; y < height; y++)
            {
                for (int x = 0; x < width; x++)
                {
                    var c = (byte)((colors.Length / 3) * ((float)y / width));
                    buffer[a++] = c;
                }
            }

            var data = new CGDataProvider(buffer);
            var cgImage = new CGImage(
                width,
                height,
                bitsPerSample,
                bitsPerPixel,
                bytesPerRow,
                colorSpace,
                CGBitmapFlags.ByteOrderDefault,
                data,
                decode: null,
                shouldInterpolate: false,
                intent: CGColorRenderingIntent.Default);

            return cgImage;
        }

関連項目

参考文献