mirror of https://github.com/python/cpython
Grab a 24-bit image off the StarterVideo
This commit is contained in:
parent
35173716e5
commit
34d12de03d
|
@ -0,0 +1,97 @@
|
|||
/*
|
||||
* svgrab24 - Grab the current video input image into an rgb file.
|
||||
*
|
||||
* Jack Jansen, CWI, May 93.
|
||||
*
|
||||
* Adapted from grabone.c
|
||||
*/
|
||||
|
||||
#ident "$Revision$"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <svideo.h>
|
||||
#include <gl/gl.h>
|
||||
#include <gl/device.h>
|
||||
#include <getopt.h>
|
||||
#include <image.h>
|
||||
|
||||
main(int argc, char *argv[])
|
||||
{
|
||||
SVhandle V;
|
||||
svCaptureInfo ci;
|
||||
boolean debug;
|
||||
int ch, errflg;
|
||||
int bufferSize;
|
||||
long *buffer;
|
||||
IMAGE *imgfile;
|
||||
short *r, *g, *b;
|
||||
int x, y;
|
||||
char *ProgName = argv[0];
|
||||
|
||||
debug = FALSE;
|
||||
ci.format = SV_RGB32_FRAMES;
|
||||
ci.width = 0;
|
||||
ci.height = 0;
|
||||
ci.size = 1;
|
||||
|
||||
argv++; argc--;
|
||||
if ( argc > 2 && strcmp(argv[0], "-w") == 0) {
|
||||
ci.width = atoi(argv[1]);
|
||||
argc -= 2;
|
||||
argv += 2;
|
||||
}
|
||||
if ( argc != 1 ) {
|
||||
fprintf(stderr, "Usage: %s [-w width] rgbfilename\n", ProgName);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
/* Open video device */
|
||||
if ((V = svOpenVideo()) == NULL) {
|
||||
svPerror("open");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (svQueryCaptureBufferSize(V, &ci, &bufferSize) < 0) {
|
||||
svPerror("svQueryCaptureBufferSize");
|
||||
exit(1);
|
||||
}
|
||||
buffer = malloc(bufferSize);
|
||||
|
||||
if (svCaptureOneFrame(V, ci.format, &ci.width, &ci.height, buffer) < 0) {
|
||||
svPerror("svCaptureOneFrame");
|
||||
exit(1);
|
||||
}
|
||||
if (debug) {
|
||||
printf("captured size: %d by %d\n", ci.width, ci.height);
|
||||
}
|
||||
|
||||
if ( (imgfile=iopen(argv[0], "w", RLE(1), 3, ci.width, ci.height, 3)) == 0) {
|
||||
perror(argv[1]);
|
||||
exit(1);
|
||||
}
|
||||
r = (short *)malloc(ci.width*sizeof(short));
|
||||
g = (short *)malloc(ci.width*sizeof(short));
|
||||
b = (short *)malloc(ci.width*sizeof(short));
|
||||
if ( !r || !g || !b ) {
|
||||
fprintf(stderr, "%s: malloc failed\n", ProgName);
|
||||
exit(1);
|
||||
}
|
||||
for(y=0; y<ci.height; y++) {
|
||||
for(x=0; x<ci.width; x++) {
|
||||
unsigned long data = *buffer++;
|
||||
|
||||
r[x] = data & 0xff;
|
||||
g[x] = (data>>8) & 0xff;
|
||||
b[x] = (data>>16) & 0xff;
|
||||
}
|
||||
if ( putrow(imgfile, r, y, 0) == 0 ||
|
||||
putrow(imgfile, g, y, 1) == 0 ||
|
||||
putrow(imgfile, b, y, 2) == 0) {
|
||||
fprintf(stderr, "%s: putrow failed\n", ProgName);
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
iclose(imgfile);
|
||||
exit(0);
|
||||
}
|
Loading…
Reference in New Issue