リソースを受け取る関数
次に,
リスト9 cv_
/* {{{ proto bool cv_save_capture(resource cvcapture capture, string filename[, array &mixed])
Capture a frame. */
PHP_FUNCTION(cv_save_capture)
{
/* リソース関連変数の宣言 */
zval * capture = NULL;
int capture_id = -1;
CvCapture * res_capture;
/* その他の変数の宣言 */
const char * filename = NULL;
int filename_len = 0;
zval * size = NULL;
/* 引数をパース */
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs|z", &capture, &filename, &filename_len, &size) == FAILURE) {
return;
}
/* リソースの実体を取得 */
ZEND_FETCH_RESOURCE(res_capture, CvCapture *, &capture, capture_id, "cvcapture", le_cvcapture);
/* 実装されていない旨のエラーを出力 */
php_error(E_WARNING, "cv_save_capture: not yet implemented"); RETURN_FALSE;
RETURN_FALSE;
}
/* }}} cv_save_capture */
引数をリソースをして取得する場合,
もし引数がリソースでない場合はzend_
この関数の実装もcv_
リスト10 追加の変数宣言
char *fullpath; /* 保存先のフルパス */
IplImage *image; /* イメージ構造体 */
リスト11 キャプチャした画像を保存
/* パスのチェック */
if (strlen(filename) != filename_len ||
(fullpath = expand_filepath(filename, NULL TSRMLS_CC)) == NULL)
{
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Wrong filename given");
RETURN_FALSE;
}
if (php_check_open_basedir(fullpath TSRMLS_CC) ||
(PG(safe_mode) && !php_checkuid(fullpath, NULL, CHECKUID_CHECK_FILE_AND_DIR)))
{
efree(fullpath);
RETURN_FALSE;
}
/* フレームを取得・保存 */
image = cvRetrieveFrame(res_capture);
if (image == NULL) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot retrieve image");
efree(fullpath);
RETURN_FALSE;
}
if (!cvSaveImage(fullpath, image)) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot save image to '%s'", fullpath);
efree(fullpath);
RETURN_FALSE;
}
/* 画像サイズを代入 */
if (size != NULL) {
CvSize imgsize = cvGetSize(image);
zval_dtor(size);
array_init(size);
add_next_index_long(size, (long)imgsize.width);
add_next_index_long(size, (long)imgsize.height);
}
efree(fullpath);
RETURN_TRUE;
インストール
実装が終わったら,
操作2 ビルド&テスト&インストール
$ phpize $ ./configure --enable-cvcapture $ make $ make test $ sudo make install
実際に使ってみる
リスト12は前回のサンプルをリソースを使うように書き直したものです。
リスト12 サンプルスクリプト
<?php
extension_loaded('cvcapture') || dl('cvcapture.so');
$capture = cv_create_camera_capture();
if ($capture) {
for ($i = 1; $i <= 10; $i++) {
cv_save_capture($capture, sprintf('capture%02d.jpg', $i));
sleep(1);
}
}
今回の目的の一つは,
表1 リソースを使わないときと使ったときの比較
リソースを使わないとき | リソースを使ったとき | |
---|---|---|
初期化 | - | 0. |
1回目 | 1. | 0. |
2回目 | 0. | 0. |
3回目 | 0. | 0. |
4回目 | 0. | 0. |
5回目 | 0. | 0. |
6回目 | 0. | 0. |
7回目 | 0. | 0. |
8回目 | 0. | 0. |
9回目 | 0. | 0. |
10回目 | 0. | 0. |
合計 | 6. | 1. |
どうやら期待通りの結果が得られたようです。このようにリソースを使えばPHPの組み込み型でない構造体を使い回すことができます。
おわりに
今回はリソースとリソースを扱う関数を定義しました。しかし,
サンプルファイルのダウンロード