[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 メーリングリストの案内