[Armadillo:08143] Re: スクリーンキャプチャ取得について

Isamu Yoshida email@hidden
2012年 7月 19日 (木) 12:32:50 JST


吉田です。

> 表示中の画面をキャプチャしたいのですが、やりかたがわかりません。

下記の通り、BMPの取り扱いが開発ガイドに方法が記載されています。
まずはご一読ください。

http://manual.atmark-techno.com/armadillo-guide/armadillo-guide-2_ja-2.1.0/ch06.html#fig_source_of_bitmap_h

また、fbから画面の生データを取得、BMPヘッダーをつける
コンバートソフトの、ソースコードを添付します。
以下利用方法です。

1.ATDEで添付ソースのクロスコンパイル

[ATDE]arm-linux-gnueabi-gcc bmpconv-a440lcd.c -o bmpconv-a440lcd
//bmpconv-a440をArmadilloにコピー
//(USBメモリーにてBMPファイルを回収するため)

2.Armadilloで操作

[armadillo]# mkdir /mnt2
[armadillo]# mount -t vfat /dev/sda1 /mnt2
[armadillo]# ls mnt2
bmpconv-a440lcd
[armadillo]# chmod -x /mnt2/bmpconv-a440lcd
[armadillo]# /mnt2/bmpconv-a440lcd /dev/fb0 /mnt2/01.bmp

お試しください。
-------------- next part --------------
#ifndef BITMAP_H
#define BITMAP_H

#include <stdint.h>

/* 繝薙ャ繝医?繝??繝輔ぃ繧?繝?繝倥ャ繝??矩?菴?繧?繝?繧?繝翫Ν) */
/*
typedef struct tagBITMAPFILEHEADER {
	uint16_t bfType;
	uint32_t bfSize;	// 繧?繝?繧?繝?繝?繝?繝井?肴??(2逡?蝨?縺九i蟋九∪繧?繝舌う繝亥?画焚)
	uint16_t bfReserved1;
	uint16_t bfReserved2;
	uint32_t bfOffBits;	// 繧?繝?繧?繝?繝?繝?繝井?肴??(10逡?蝨?縺九i蟋九∪繧?繝舌う繝亥?画焚)
} BITMAPFILEHEADER, *PBITMAPFILEHEADER;
*/

/* 繝薙ャ繝医?繝??繝輔ぃ繧?繝?繝倥ャ繝??矩?菴?*/
typedef struct tagBITMAPFILEHEADER {
	uint16_t bfType;
	uint16_t bfSize_l;	// Size荳倶??6繝薙ャ繝?	uint16_t bfSize_h;	// Size荳贋??6繝薙ャ繝?	uint16_t bfReserved1;
	uint16_t bfReserved2;
	uint16_t bfOffBits_l;	// OffBits荳倶??6繝薙ャ繝?	uint16_t bfOffBits_h;	// OffBits荳贋??6繝薙ャ繝?} BITMAPFILEHEADER, *PBITMAPFILEHEADER;

/* 繝薙ャ繝医?繝??繝輔ぃ繧?繝?繝倥ャ繝?Γ繝?繝仙叙蠕励?繧?繝? */
/* Size縺?OffBits縺?荳贋??6bit縺?荳倶??6bit繧貞挨縲?↓蜿門?励@縺?32bit縺?蜷域?縺吶k */
#define BITMAPFILEHEADER_TYPE(pbf)	(((PBITMAPFILEHEADER)(pbf))->bfType)
#define BITMAPFILEHEADER_SIZE(pbf)					\
	(((uint32_t)((PBITMAPFILEHEADER)(pbf))->bfSize_h << 16) |	\
	 ((uint32_t)((PBITMAPFILEHEADER)(pbf))->bfSize_l      ))
#define BITMAPFILEHEADER_OFFBITS(pbf)					\
	(((uint32_t)((PBITMAPFILEHEADER)(pbf))->bfOffBits_h << 16) |	\
	 ((uint32_t)((PBITMAPFILEHEADER)(pbf))->bfOffBits_l      ))

/* 繝薙ャ繝医?繝??繝輔ぃ繧?繝?繧?繧?繝苓?伜挨蟄?*/
#define BF_TYPE (*(uint16_t *)"BM")

/* 繝薙ャ繝医?繝??諠??繝倥ャ繝??矩?菴?*/
typedef struct tagBITMAPINFOHEADER {
	uint32_t biSize;
	int32_t  biWidth;
	int32_t  biHeight;
	uint16_t biPlanes;
	uint16_t biBitCount;
	uint32_t biCompression;
	uint32_t biSizeImage;
	int32_t  biXPelsPerMeter;
	int32_t  biYPelsPerMeter;
	uint32_t biClrUsed;
	uint32_t biClrImportant;
} BITMAPINFOHEADER, *PBITMAPINFOHEADER;

/* 繝薙ャ繝医?繝??諠??繝倥ャ繝?Γ繝?繝仙叙蠕励?繧?繝? */
#define BITMAPINFOHEADER_SIZE(pbi)	(((PBITMAPINFOHEADER)(pbi))->biSize)
#define BITMAPINFOHEADER_WIDTH(pbi)	(((PBITMAPINFOHEADER)(pbi))->biWidth)
#define BITMAPINFOHEADER_HEIGHT(pbi)	(((PBITMAPINFOHEADER)(pbi))->biHeight)
#define BITMAPINFOHEADER_PLANES(pbi)	(((PBITMAPINFOHEADER)(pbi))->biPlanes)
#define BITMAPINFOHEADER_BITCOUNT(pbi)	(((PBITMAPINFOHEADER)(pbi))->biBitCount)
#define BITMAPINFOHEADER_COMPRESSION(pbi)	\
	(((PBITMAPINFOHEADER)(pbi))->biCompression)
#define BITMAPINFOHEADER_SIZEIMAGE(pbi)	\
	(((PBITMAPINFOHEADER)(pbi))->biSizeImage)
#define BITMAPINFOHEADER_XPELSPERMETER(pbi)	\
	(((PBITMAPINFOHEADER)(pbi))->biXPelsPerMeter)
#define BITMAPINFOHEADER_YPELSPERMETER(pbi)	\
	(((PBITMAPINFOHEADER)(pbi))->biYPelsPerMeter)
#define BITMAPINFOHEADER_CLRUSED(pbi)	(((PBITMAPINFOHEADER)(pbi))->biClrUsed)
#define BITMAPINFOHEADER_CLRIMPORTANT(pbi)	\
	(((PBITMAPINFOHEADER)(pbi))->biClrImportant)

#endif /* BITMAP_H */
-------------- next part --------------
#include <stdio.h>

#include "bitmap.h"

#define WIDTH  480
#define HEIGHT 272
#define DEPTH  2

int main(char argc, char *argv[])
{
	BITMAPFILEHEADER bmpfilehead = {
		.bfType = 0x4d42,
		.bfSize_l = (sizeof(BITMAPFILEHEADER) +
			     sizeof(BITMAPINFOHEADER) +
			     DEPTH * WIDTH * HEIGHT
#if (DEPTH == 2)
			     + sizeof(uint32_t) * 3
#endif
			) & 0x0000ffff,
		.bfSize_h = (sizeof(BITMAPFILEHEADER) +
			     sizeof(BITMAPINFOHEADER) +
			     DEPTH * WIDTH * HEIGHT
#if (DEPTH == 2)
			     + sizeof(uint32_t) * 3
#endif
			) >> 16,
		.bfReserved1 = 0,
		.bfReserved2 = 0,
		.bfOffBits_l = (sizeof(BITMAPFILEHEADER) +
				sizeof(BITMAPINFOHEADER)
#if (DEPTH == 2)
				+ sizeof(uint32_t) * 3
#endif
			) & 0x0000ffff,
		.bfOffBits_h = (sizeof(BITMAPFILEHEADER) +
				sizeof(BITMAPINFOHEADER)
#if (DEPTH == 2)
				+ sizeof(uint32_t) * 3
#endif
			) >> 16,
	};
	BITMAPINFOHEADER bmpinfohead = {
		.biSize = sizeof(BITMAPINFOHEADER),
		.biWidth = WIDTH,
		.biHeight = HEIGHT,
		.biPlanes = 1,
		.biBitCount = 8 * DEPTH,
#if (DEPTH == 2)
		.biCompression = 3,
#else
		.biCompression = 0,
#endif
		.biSizeImage = DEPTH * WIDTH * HEIGHT,
		.biXPelsPerMeter = 0,
		.biYPelsPerMeter = 0,
		.biClrUsed = 0,
		.biClrImportant = 0,
	};
#if (DEPTH == 2)
	uint32_t bmprgbmask[3] = { 0x0000f800, 0x000007e0, 0x0000001f };
#endif
	FILE *fp;
	int x, y;
	uint8_t buf[HEIGHT][WIDTH][DEPTH];

	if (argc < 3) {
		printf("usage: %s [infile] [outfile]\n", argv[0]);
		return 0;
	}

	fp = fopen(argv[1], "r");
	if (!fp) {
		fprintf(stderr, "fopen failed.\n");
		return -1;
	}
	for (y = 0; y < HEIGHT; y++)
		if (fread(buf[y], DEPTH, WIDTH, fp) < WIDTH) {
			fprintf(stderr, "fread failed.\n");
			return -1;
		}
	fclose(fp);

	fp = fopen(argv[2], "w");
	if (!fp) {
		fprintf(stderr, "fopen failed.\n");
		return -1;
	}
	if (fwrite(&bmpfilehead, 1, sizeof(bmpfilehead), fp)
	    < sizeof(bmpfilehead)) {
		fprintf(stderr, "fwrite failed.\n");
		return -1;
	}
	if (fwrite(&bmpinfohead, 1, sizeof(bmpinfohead), fp)
	    < sizeof(bmpinfohead)) {
		fprintf(stderr, "fwrite failed.\n");
		return -1;
	}
#if (DEPTH == 2)
	if (fwrite(bmprgbmask, 1, sizeof(bmprgbmask), fp)
	    < sizeof(bmprgbmask)) {
		fprintf(stderr, "fwrite failed.\n");
		return -1;
	}
#endif
	for (y = HEIGHT - 1; y >= 0; y--)
		if (fwrite(buf[y], DEPTH, WIDTH, fp) < WIDTH) {
			fprintf(stderr, "fwrite failed.\n");
			return -1;
		}
	fclose(fp);

	return 0;
}


armadillo メーリングリストの案内