require_once dirname(__FILE__) . '/../lib/Application.php';
Horde_Registry::appInit('ansel');
-$faces = Ansel_Faces::factory();
+$faces = $GLOBALS['injector']->getInstance('Ansel_Faces');
$face_id = Horde_Util::getFormData('face');
try {
$face = $faces->getFaceById($face_id);
$name = Horde_Util::getFormData('name');
if ($face_id) {
- $faces = Ansel_Faces::factory();
+ $faces = $GLOBALS['injector']->getInstance('Ansel_Faces');
try {
$face = $faces->getFaceById($face_id, true);
$x1 = $face['face_x1'];
require_once dirname(__FILE__) . '/../lib/Application.php';
Horde_Registry::appInit('ansel');
-$faces = Ansel_Faces::factory();
+$faces = $GLOBALS['injector']->getInstance('Ansel_Faces');
$face_id = Horde_Util::getFormData('face');
try {
$face = $faces->getFaceById($face_id);
$reloadimage = Horde_Themes::img('reload.png');
$customimage = Horde_Themes::img('layout.png');
$customurl = Horde_Util::addParameter(Horde::applicationUrl('faces/custom.php'), 'page', $page);
-$face = Ansel_Faces::factory();
+$face = $GLOBALS['injector']->getInstance('Ansel_Faces');
$autogenerate = $face->canAutogenerate();
$vars = Horde_Variables::getDefaultVariables();
require_once dirname(__FILE__) . '/../lib/Application.php';
Horde_Registry::appInit('ansel');
-$faces = Ansel_Faces::factory();
+$faces = $GLOBALS['injector']->getInstance('Ansel_Faces');
$name = '';
$autocreate = true;
Horde_Registry::appInit('ansel');
$face_id = Horde_Util::getFormData('face');
-$faces = Ansel_Faces::factory();
+$faces = $GLOBALS['injector']->getInstance('Ansel_Faces');
// Sendfile support. Lighttpd < 1.5 only understands the X-LIGHTTPD-send-file
// header
throw new Horde_Exception('Access denied editing the photo.');
}
-$faces = Ansel_Faces::factory();
+$faces = $GLOBALS['injector']->getInstance('Ansel_Faces');
$result = $faces->setName($face_id, $name);
$face_id = Horde_Util::getFormData('face');
-$faces = Ansel_Faces::factory();
+$faces = $GLOBALS['injector']->getInstance('Ansel_Faces');
try {
$face = $faces->getFaceById($face_id);
} catch (Horde_Exception $e) {
exit;
}
try {
- $faces = Ansel_Faces::factory();
+ $faces = $GLOBALS['injector']->getInstance('Ansel_Faces');
$result = $faces->saveCustomFace(
$face_id,
$image_id,
require_once dirname(__FILE__) . '/../../lib/Application.php';
Horde_Registry::appInit('ansel');
-$faces = Ansel_Faces::factory();
+$faces = $GLOBALS['injector']->getInstance('Ansel_Faces');
/* Show tabs */
$vars = Horde_Variables::getDefaultVariables();
return array('response' => 0);
}
- $faces = Ansel_Faces::factory();
+ $faces = $GLOBALS['injector']->getInstance('Ansel_Faces');
switch($action) {
case 'process':
// process - detects all faces in the image.
throw new Horde_Exception('Access denied editing the photo.');
}
- $faces = Ansel_Faces::factory();
+ $faces = $GLOBALS['injector']->getInstance('Ansel_Faces');
$faces->delete($image, $face_id);
break;
throw new Horde_Exception('You are not allowed to edit this photo');
}
- $faces = Ansel_Faces::factory();
+ $faces = $GLOBALS['injector']->getInstance('Ansel_Faces');
$result = $faces->setName($face_id, $name);
return array('response' => 1,
'message' => Ansel_Faces::getFaceTile($face_id));
$binders = array(
'Ansel_Storage' => new Ansel_Injector_Binder_Storage(),
'Ansel_Styles' => new Ansel_Injector_Binder_Styles(),
+ 'Ansel_Faces' => new Ansel_Injector_Binder_Faces(),
);
foreach ($binders as $interface => $binder) {
$GLOBALS['injector']->addBinder($interface, $binder);
function _content()
{
- $faces = Ansel_Faces::factory();
+ $faces = $GLOBALS['injector']->getInstance('Ansel_Faces');
$results = $faces->allFaces(0, $this->_params['limit']);
$html = '';
foreach ($results as $face_id => $face) {
class Ansel_Faces
{
/**
- * Create instance
- */
- static function factory($driver = null, $params = array())
- {
- if ($driver === null) {
- $driver = $GLOBALS['conf']['faces']['driver'];
- }
-
- if (empty($params)) {
- $params = $GLOBALS['conf']['faces'];
- }
-
- $class_name = 'Ansel_Faces_' . $driver;
- $parser = new $class_name($params);
-
- return $parser;
- }
-
- /**
* Delete faces from VFS and DB storage.
*
* @TODO: Move SQL queries to Ansel_Storage::
*/
static public function getFaceTile($face)
{
- $faces = Ansel_Faces::factory();
+ $faces = $GLOBALS['injector']->getInstance('Ansel_Faces');
if (!is_array($face)) {
$face = $faces->getFaceById($face, true);
}
}
// Link for searching for similar faces.
- $html .= ' <a href="' . Horde_Util::addParameter($search_url, 'face_id', $face_id)
- . '">' . _("Find similar") . '</a>';
+ $html .= ' <a href="' . Horde_Util::addParameter($search_url, 'face_id', $face_id) . '">' . _("Find similar") . '</a>';
$html .= '</div></td></tr></table>';
return $html;
*
* @return mixed Array of face data
*/
- public function getFaces(&$image)
+ public function getFaces($image)
{
if ($image instanceof Ansel_Image) {
// First check if screen view exists
// Make sure we have an on-disk copy of the file.
$file = $GLOBALS['injector']->getInstance('Horde_Vfs')->getVfs('images')->readFile($image->getVFSPath('screen'),
$image->getVFSName('screen'));
- } elseif (empty($file) || !is_string($image)) {
+ } else {
+ $file = $image;
+ }
+ if (empty($file) || !is_string($image)) {
return array();
}
$sql .= ', gallery_id, face_x1, face_y1, face_x2, face_y2';
}
$sql .= ' FROM ansel_faces WHERE image_id = ' . (int)$image_id
- . ' ORDER BY face_id DESC';
+ . ' ORDER BY face_id DESC';
Horde::logMessage('SQL Query by Ansel_Faces::getImageFacesData: ' . $sql, 'DEBUG');
$result = $GLOBALS['ansel_db']->query($sql);
public function getGalleryFaces($gallery)
{
$sql = 'SELECT face_id, image_id, gallery_id, face_name FROM ansel_faces '
- . ' WHERE gallery_id = ' . (int)$gallery . ' ORDER BY face_id DESC';
+ . ' WHERE gallery_id = ' . (int)$gallery . ' ORDER BY face_id DESC';
$result = $GLOBALS['ansel_db']->query($sql);
if ($result instanceof PEAR_Error) {
$faces = array();
while ($face = $result->fetchRow(MDB2_FETCHMODE_ASSOC)) {
$faces[$face['face_id']] = array('face_name' => $face['face_name'],
- 'face_id' => $face['face_id'],
- 'gallery_id' => $face['gallery_id'],
- 'image_id' => $face['image_id']);
+ 'face_id' => $face['face_id'],
+ 'gallery_id' => $face['gallery_id'],
+ 'image_id' => $face['image_id']);
}
return $faces;
{
$info = array(
'filter' => 's.share_owner = ' . $GLOBALS['ansel_db']->quote($owner),
- 'order' => 'f.face_id DESC');
+ 'order' => 'f.face_id DESC'
+ );
if (!Horde_Auth::getAuth() || $owner != Horde_Auth::getAuth()) {
$info['filter'] .= ' AND s.gallery_passwd IS NULL';
return false;
}
$data = $this->getFaceById($face_id, true);
-
- $image = &$GLOBALS['ansel_storage']->getImage($image_id);
+ $image = $GLOBALS['ansel_storage']->getImage($image_id);
// Actually create the image.
$this->createView(
*/
public function saveCustomFace($face_id, $image, $x1, $y1, $x2, $y2, $name = '')
{
- $image = &$GLOBALS['ansel_storage']->getImage($image);
+ $image = $GLOBALS['ansel_storage']->getImage($image);
$gallery = $GLOBALS['ansel_storage']->getGallery($image->gallery);
if (!$gallery->hasPermission(Horde_Auth::getAuth(), Horde_Perms::EDIT)) {
throw new Horde_Exception_PermissionDenied('Access denied editing the photo.');
// Process the image
$this->createView($face_id,
- $image,
- $x1,
- $y1,
- $x2,
- $y2);
+ $image,
+ $x1,
+ $y1,
+ $x2,
+ $y2);
// Clean up as images are static and all gallery images data will remain in memory
$image->reset();
-
// Store face id db
if (empty($new)) {
$sql = 'UPDATE ansel_faces SET face_name = ?, face_x1 = ?, face_y1 = ?, face_x2 = ?, face_y2 = ?'
*
* @return integer the face id
*/
- public function createView($face_id, &$image, $x1, $y1, $x2, $y2)
+ public function createView($face_id, $image, $x1, $y1, $x2, $y2)
{
// Make sure screen view is created and loaded
$image->load('screen');
$path = Ansel_Faces::getVFSPath($image->id);
$image->getHordeImage()->resize(50, 50, false);
try {
- $GLOBALS['injector']->getInstance('Horde_Vfs')->getVfs('images')->writeData($path . 'faces', $face_id . $ext,
- $image->getHordeImage()->raw(), true);
+ $GLOBALS['injector']->getInstance('Horde_Vfs')->getVfs('images')->writeData(
+ $path . 'faces',
+ $face_id . $ext,
+ $image->getHordeImage()->raw(),
+ true);
} catch (VFS_Exception $e) {
throw new Horde_Exception_Prior($e);
}
}
// Ensure we have an on-disk file to read the signature from.
- $path = $GLOBALS['injector']->getInstance('Horde_Vfs')->getVfs('images')->readFile(Ansel_Faces::getVFSPath($image_id) . '/faces',
- $face_id . Ansel_Faces::getExtension());
+ $path = $GLOBALS['injector']->getInstance('Horde_Vfs')->getVfs('images')->readFile(
+ Ansel_Faces::getVFSPath($image_id) . '/faces',
+ $face_id . Ansel_Faces::getExtension());
$signature = puzzle_fill_cvec_from_file($path);
if (empty($signature)) {
{
$sql = 'UPDATE ansel_faces SET face_name = ? WHERE face_id = ?';
$params = array($name, $face);
-
$q = $GLOBALS['ansel_db']->prepare($sql, null, MDB2_PREPARE_MANIP);
if ($q instanceof PEAR_Error) {
throw new Horde_Exception_Prior($q);
// Always return the face_id
$face['face_id'] = $face_id;
- if ($full && $GLOBALS['conf']['faces']['search'] &&
- function_exists('puzzle_uncompress_cvec')) {
+ if ($full && $GLOBALS['conf']['faces']['search'] && function_exists('puzzle_uncompress_cvec')) {
$face['face_signature'] = puzzle_uncompress_cvec($face['face_signature']);
}
$indexes[] = '(index_position = '
. $GLOBALS['ansel_db']->quote($i, 'integer')
. ' AND index_part = '
- . $GLOBALS['ansel_db']->quote(
- substr($signature, $i * $word_len, $word_len))
+ . $GLOBALS['ansel_db']->quote(substr($signature, $i * $word_len, $word_len))
. ')';
}
'image_id' => $face['image_id'],
'similarity' => puzzle_vector_normalized_distance(
$signature,
- puzzle_uncompress_cvec($face['face_signature'])));
+ puzzle_uncompress_cvec($face['face_signature']))
+ );
}
uasort($faces, array($this, '_getSignatureMatches'));
* @author Duck <duck@obala.net>
* @package Ansel
*/
-class Ansel_Faces_facedetect extends Ansel_Faces_Base
+class Ansel_Faces_Facedetect extends Ansel_Faces_Base
{
/**
* Where the face defintions are stored
$this->_defs = $params['defs'];
}
+ /**
+ *
+ */
public function canAutogenerate()
{
return true;
*/
protected function _getFaces($file)
{
- $result = Horde_Util::loadExtension('facedetect');
- if (!$result) {
+ if (!Horde_Util::loadExtension('facedetect')) {
throw new Horde_Exception('You do not have the facedetect extension enabled in PHP');
}
protected function _getParamsArray($face_id, $image, $rect)
{
- $params = array($face_id,
- $image->id,
- $image->gallery,
- $rect['x'],
- $rect['y'],
- $rect['x'] + $rect['w'],
- $rect['y'] + $rect['h']);
- return $params;
+ return array($face_id,
+ $image->id,
+ $image->gallery,
+ $rect['x'],
+ $rect['y'],
+ $rect['x'] + $rect['w'],
+ $rect['y'] + $rect['h']);
}
protected function _createView($face_id, $image, $rect)
+++ /dev/null
-<?php
-/**
- * OpenCV implementation
- *
- * @author Duck <duck@obala.net>
- * @package Ansel
- */
-class Ansel_Faces_opencv extends Ansel_Faces_Base
-{
- /**
- * Where the face defintions are stored
- */
- private $_defs = '';
-
- /**
- * Create instance
- */
- public function __construct($params)
- {
- $this->_defs = $params['defs'];
- }
-
- public function canAutogenerate()
- {
- return true;
- }
-
- /**
- * Get faces
- *
- * @param string $file Picture filename
- */
- protected function _getFaces($file)
- {
- $result = Horde_Util::loadExtension('opencv');
- if (!$result) {
- throw new Horde_Exception('You do not have the opencv extension enabled in PHP');
- }
- $im = cv_image_load($file);
- $haar = cv_object_load($this->_defs);
- $seq = cv_haar_classifier_cascade_detect_objects($haar, $im);
- $l = cv_seq_count($seq);
- Horde::logMessage(sprintf("opencv extension detected %u faces.", $l), 'DEBUG');
- $rects = array();
- for ($i = 0; $i < $l; $i++) {
- $r = cv_seq_get($seq, $i);
- $rects[] = array('x' => $r['x'],
- 'y' => $r['y'],
- 'width' => $r['w'],
- 'height' => $r['h']);
- }
-
- return $rects;
- }
-
- /**
- * Check if a face in is inside anoter face
- *
- * @param array $face Face we are cheking
- * @param array $faces Existing faces
- *
- * @param int Face ID containg passed face
- */
- protected function _isInFace($face, $faces)
- {
- foreach ($faces as $id => $rect) {
- if ($face['x'] > $rect['x'] && $face['x'] + $face['width'] < $face['x'] + $rect['width']
- && $face['y'] > $rect['y'] && $face['y'] + $face['height'] < $face['y'] + $rect['height']) {
- return $id;
- }
- }
-
- return false;
- }
-
- protected function _getParamsArray($face_id, $image, $rect)
- {
- $params = array($face_id,
- $image->id,
- $image->gallery,
- $rect['x'],
- $rect['y'],
- $rect['x'] + $rect['width'],
- $rect['y'] + $rect['height']);
- return $params;
- }
-
- protected function _createView($face_id, $image, $rect)
- {
- return $this->createView($face_id,
- $image,
- $rect['x'],
- $rect['y'],
- $rect['x'] + $rect['width'],
- $rect['y'] + $rect['height']);
- }
-}
* @author Duck <duck@obala.net>
* @package Ansel
*/
-class Ansel_Faces_user extends Ansel_Faces_Base
+class Ansel_Faces_User extends Ansel_Faces_Base
{
}
--- /dev/null
+<?php
+/**
+ * Binder for Ansel_Faces
+ *
+ * @author Michael J. Rubinsky <mrubinsk@horde.org>
+ * @category Horde
+ * @license http://www.fsf.org/copyleft/gpl.html GPL
+ * @package Ansel
+ */
+class Ansel_Injector_Binder_Faces Implements Horde_Injector_Binder
+{
+ public function create (Horde_Injector $injector)
+ {
+ $driver = $GLOBALS['conf']['faces']['driver'];
+ $params = $GLOBALS['conf']['faces'];
+ $class_name = 'Ansel_Faces_' . ucfirst($driver);
+
+ return new $class_name($params);
+ }
+
+ /**
+ */
+ public function equals(Horde_Injector_Binder $binder)
+ {
+ return false;
+ }
+}
\ No newline at end of file
. '<br /><em>' . _("No faces found") . '</em></div>';
}
- $faces = Ansel_Faces::factory();
+ $faces = $GLOBALS['injector']->getInstance('Ansel_Faces');
// Check for existing faces for this gallery.
$html = '<div style="display: block'
*/
protected function _getFaceNames()
{
- $faces = Ansel_Faces::factory();
+ $faces = $GLOBALS['injector']->getInstance('Ansel_Faces');
// Check for existing faces for this image.
$html = '';
return '';
}
- $this->_faces = Ansel_Faces::factory();
+ $this->_faces = $GLOBALS['injector']->getInstance('Ansel_Faces');
$this->_owner = $this->_view->gallery->get('owner');
try {
$this->_count = $this->_faces->countOwnerFaces($this->_owner);