четверг, 20 августа 2015 г.

live-vk.com - мошенники? Скорее всего - да.

   Небольшое вступление.
   На сайте Avito.ru мелькнуло объявление о продаже фототехники за половину цены. Конечно же, не смог оставить его без внимания и закинул в избранное, чтобы на досуге более подробно изучить предложение. Заодно закинул в избранное ссылку на страницу, указанную продавцом как торговую площадку, чтобы посмотреть, что еще человек предлагает.
   На следующий день объявление на авито было заблокировано. Взгрустнул, но недолго - у меня же была ссылка на торговую площадку! Пошел туда. Выяснил, что некто "Виктор", работая на оптовом складе "М.Видео", продает технику с существенной уценкой. Заинтересовавший меня Canon 70D предлагает не за 54 т.р., как указано на сайте магазина, а за 30! Шикарный фотоаппарат, на который как раз хватило бы, если продать всю имеющуюся у меня фотоаппаратуру... Конечно же, желание стать обладателем такой чудесной машинки подтолкнуло меня на дальнейшие шаги. :)
   Связался с продавцом, чтобы уточнить, каким образом можно купить заинтересовавший меня фотоаппарат. Вот тут началось самое интересное. Выяснилось, что "Виктор" не встречается с покупателями лично, а направляет курьера с товаром, при условии ПРЕДВАРИТЕЛЬНОЙ оплаты. На мои предложения оплатить после осмотра фотоаппарата ответил, что у курьеров, якобы, отбирают товар, производят подмены товара или платят фальшивыми деньгами, поэтому он настаивает на предварительной оплате через системы qiwi или wallet.
   Предлагаю встретиться с курьером в общественном месте, например, торговом центре, где есть охрана. И оплатить через терминал на его счет, чтобы исключить вероятность оплаты фальшивыми купюрами. Продавец не соглашается и настаивает "хотя бы" оплате половины стоимости вперед. Как вариант, предлагает использовать "гарант сервис" на том же сайте live-vk.com.
   Полез на сайт изучать разделы про этот "гарант-сервис" ну и вообще поближе познакомиться с ресурсом. Суть сервиса в том, что человек перечисляет некоему пользователю сайта стоимость товара + 10% комиссии сверху и в случае, если сделка состоится, этот гарант перечисляет деньги продавцу или возвращает их покупателю. Гы. Гарантом выступает другой пользователь сайта, которого я тоже не знаю. Т.е. ситуация еще смешнее стала - заплати +10% сверху стоимости для обеспечения "безопасной" сделки.
   Да и сам сайт начал вызывать вопросы. Однообразные комментарии "довольных покупателей", небольшое количество сообщений и тем, связанных с продажами... Никаких отзывов о работе сайта в инете не нашел - ни отрицательных, ни положительных. Заглянул на сайт 2ip.ru чтобы проверить, что за сайт-то такой и выяснил, что имя live-vk.com было зарегистрировано 11 августа 2015 года. Вспомнил, что объявление на авито от "Виктора" появилось то-ли 13, то-ли 14-го августа.. Интересно, да? Сообщения в форуме начинают датироваться с 2010 года, но это тоже легко фальсифицируется - разворачиваем форум на локальной машине, ставим системную дату на любой нужный нам год и вперед.. плодим юзеров, сообщения, меняем дату на более свежую и так далее. Месяц работы, затем заливаем базу форума на арендуемый сервер и вуаля! Имеем форум с сообщениями, датируемыми любым временным интервалом.
   В общем, решил, что скорее всего - это мошенники. Нормальный продавец согласился бы на оплату после осмотра, либо же осуществлял бы торговлю через площадки molotok или ebay. Нормальная торговая площадка имеет длительную историю в виде отзывов пользователей на других ресурсах, например, в тех же блогах. Или в виде обзоров на новостных сайтах. Нормальный продавец не будет кидать объявление на авито с интригующим заголовком "любая фототехника за полцены" а потом в личке говорить, что он не очень заинтересован в привлечении новых клиентов и готов работать со старыми по удобной ему схеме.
   В общем, берегите свои деньги и нервы, уважаемые. :) По возможности проверяйте продавца и не платите вперед, даже если вам предлагают... э-эх... новенький Canon 70D всего за 30 тысяч рублей. :)

воскресенье, 2 августа 2015 г.

Тестируем матрицу зеркального фотоаппарата - PSD и PHP

   Выкладываю обещанный скрипт для проверки наличия битых пикселей на матрице. Да кому он нужен, когда можно глазками все посмотреть? Он может пригодиться при покупке б/у фотоаппаратов через интернет, или для выбора лучшего фотоаппарата из нескольких, например, в магазине
   Для начала надо заполучить RAW'ки, сделанные в максимальном разрешении, в режиме приоритета выдержки, в режиме ручной фокусировки с закрытым объективом (крышечку с объектива не снимаем). Чтобы было какое-то единообразие, пусть ISO пусть будет 100. В интернете встречаются рекомендации по установке выдержки в 3-5 секунд... Я-перфекционист, хочу, чтобы выдержка была 10 секунд.
   Полученный "черный" кадр, конечно, можно и глазками посмотреть, но на дворе 21-й век! Поэтому немного схитрим.
   Открываем RAW-файл любом подходящем графическом редакторе. В моем случае любым подходящим оказался Lightroom. RAW-файл экспортируем в PSD в формате 16-битного sRGB.
   Теперь пару слов о том, что делает скрипт.
   В конце PSD файла в формате RRR GGG BBB находятся данные нашей картинки. Помним, что мы конвертировали наш файл в формате 16-битного sRGB. Обращаем внимание на то, что у нас структура файла не RGBRGBRGB... а RRRRRR...GGGGG...BBBBB. Я не обратил на это в первый раз внимания, за что и поплатился... :о)
   Скрипт читает заголовок файла, откуда получает информацию о размерах картинки и расположении блока Image Data Section, и начинает читать по два байта данные, пробегая массив данных RRRRR, затем GGGGG и наконец BBBBB, попутно "запоминая" элементы, яркость которых превышает указанный нами порог и выводит данные об обнаруженных точках в файл. Выводятся данные о координатах точек и яркости каналов, позволивших себе выделиться на общем фоне. :о).
   На моем ноуте первоначальный вариант скрипта разбирал 12 миллионов пикселей более чем за 340 секунд. Сейчас 17 миллионов пикселей скрипт разбирает чуть более чем за 90 чекунд. Но мне кажется, что и 90 секунд - не предел.
   Ну а теперь, собственно, сам скрипт.



//Каждый цвет может иметь интенсивность от 0 до 65535 и кодируется 2 байтами.
//Блок с данными находится в конце файла. 
//Перед ним блоки переменной длины, читаем заголовки.
//Ищем точки, в которых одна из компонент R,G или B превышает порог, 
//заданный в параметрах при запуске скрипта.
//Пороговое значение задается в процентах.
//
$reshandle=fopen($argv[1]."-".$argv[2].".res",'w');  //Открываем файл для резудбтатов
$start_time=time();     //Фиксируем время старта скрипта.
$header=array();
$handle=fopen($argv[1],'r');    //Открываем файл формата PSD, указанный в параметрах
$resarr=array();
$width=0;      //Длина картинки 
$height=0;      //Высота картинки
$pixcnt=0;
$limit=(int)((65535*$argv[2])/100);   //Рассчитываем пороговое значение
$cur_pos=0;      //Текущая позиция в файле
$content;      //А сюда будем читать байты (2 шт), отвечающие за один пиксель
$shine_num=0;      //Счетчик "битых" пикселей 

//В этом блоке читаем заголовок PSD файла и вытаскиваем оттуда размеры картинки
for ($i=0;$i<26;$i++)    
    {$byte = fread($handle,1);
     $header[$i]=$byte;
    }
$bh=array($header[14],$header[15],$header[16],$header[17]);
$bw=array($header[18],$header[19],$header[20],$header[21]);
$height=HEX_DEC_CONVERT($bh);
$width=HEX_DEC_CONVERT($bw);
$pixcnt=$height*$width;
//Выводим полученную информацию в файл
fwrite($reshandle,"Width (pxl): ".$width."\r\n");
fwrite($reshandle,"Height (pxl): ".$height."\r\n");
fwrite($reshandle,"Size (pxl): ".$pixcnt."\r\n=====================\r\n");


//Пойдем по-взрослому, с начала файла, читая заголовки блоков файла
$cur_pos=$cur_pos+26;
echo $cur_pos."\r\n";

//Color Mode Data Section
fseek($handle,$cur_pos);
for ($i=0;$i<4;$i++)    
    {$byte = fread($handle,1);
     $farr[$i]=$byte;
    }
$cur_pos=ftell($handle)+HEX_DEC_CONVERT($farr);
echo $cur_pos."\r\n";
fseek($handle,$cur_pos);

//Image Resources Section
fseek($handle,$cur_pos);
for ($i=0;$i<4;$i++)    
    {$byte = fread($handle,1);
     $farr[$i]=$byte;
    }
$cur_pos=ftell($handle)+HEX_DEC_CONVERT($farr);
echo $cur_pos."\r\n";
fseek($handle,$cur_pos);

//Layer and Mask Information Section
fseek($handle,$cur_pos);
for ($i=0;$i<4;$i++)    
    {$byte = fread($handle,1);
     $sarr[$i]=$byte;
    }
$cur_pos=ftell($handle)+HEX_DEC_CONVERT($sarr)+2;
echo $cur_pos."\r\n";
fseek($handle,$cur_pos);


$tmp_arr=array();
//====================
$i=0;
for($y=0;$y<$height;$y++)
   {for($x=0;$x<$width;$x++)     
      {
//читаем данные по одной точке - 2 байт. 
    $content=fread($handle,2);
    $tmp_arr[0]=$content[0];
    $tmp_arr[1]=$content[1];
    $R=HEX_DEC_CONVERT($tmp_arr);
//Сравниваем с пороговым значением. 
//Если есть необходимость - сохраняем в массиве
// координаты и значения компоненты RGB
    if ( ($R>$limit) )    
       {$resarr[$x][$y]['R']=$R;        
        $resarr[$x][$y]['G']=null;        
        $resarr[$x][$y]['B']=null;        
       }       
      }
   }

for($y=0;$y<$height;$y++)
   {for($x=0;$x<$width;$x++)     
      {
//читаем данные по одной точке - 2 байт. 
    $content=fread($handle,2);
    $tmp_arr[0]=$content[0];
    $tmp_arr[1]=$content[1];
    $G=HEX_DEC_CONVERT($tmp_arr);

    if ( ($G>$limit) )    
       {$resarr[$x][$y]['R']=null;        
        $resarr[$x][$y]['G']=$G;        
        $resarr[$x][$y]['B']=null;        
       }       
      }
   }

for($y=0;$y<$height;$y++)
   {for($x=0;$x<$width;$x++)     
      {
//читаем данные по одной точке - 2 байт. 
    $content=fread($handle,2);
    $tmp_arr[0]=$content[0];
    $tmp_arr[1]=$content[1];
    $B=HEX_DEC_CONVERT($tmp_arr);

    if ( ($B>$limit) )    
       {$resarr[$x][$y]['R']=null;        
        $resarr[$x][$y]['G']=null;        
        $resarr[$x][$y]['B']=$B;        
       }       
      }
   }
//Разбор массива и вывод результатов в файл
reset($resarr);
$R="";
$G="";
$B="";
while (list($key,$val)=each($resarr))
  {
   while (list($skey,$sval)=each($resarr[$key]))
     {if (!is_null($sval['R'])) {$R="  RED: ".$sval['R'];}
      if (!is_null($sval['G'])) {$G="  GREEN: ".$sval['G'];}
      if (!is_null($sval['B'])) {$B="  BLUE: ".$sval['B'];}
      
      fwrite($reshandle,"\r\nX: ".$key."; Y: ".$skey."    ".$R.$G.$B);
      $shine_num++;
     }


  }


//Цикл обработки закончился, выводим результаты работы
fwrite($reshandle,"\r\n================================\r\n");
fwrite($reshandle,"\r\nBrightness: ".$argv[2]."%");
fwrite($reshandle,"\r\nNumber of shine pixels :".$shine_num);
fwrite($reshandle,"\r\nWorking time (sec):".(time()-$start_time));

//echo ftell($handle)."\r\n";

fclose($handle);
fclose($reshandle);


//===================================================
//Переводим значения из двухбайтного HEX в DEC
function HEX_DEC_CONVERT(array $arg)
   {$result=0;
    $cnt=count($arg);
//echo $cnt."\r\n";
    for ($f=$cnt;$f>0;$f--)
       {$result=$result+ord($arg[$f-1])*pow(256,$cnt-$f);
   
       }
    return $result;
   }


   Чуть не забыл. Запускаем скрипт с параметрами. Первый параметр - имя файла. Второй параметр - процент.
php.exe shinepxl.php 5d.psd 5

На выходе получим файл с именем 5d.psd-5.res

Содержимое файла:

Width (pxl): 5184
Height (pxl): 3456
Size (pxl): 17915904
===============================================================

X: 24; Y: 2105      RED: 64646
===============================================================

Brightness: 40%
Number of shine pixels :1
Working time (sec):93

   В файле ширина, высота, общее количество точек. Потом перечисляются точки, у которых хотя бы одна составляющая R,G или B превышает заданное значение. Начало координатных осей - верхний левый угол.
   В конце - пороговое значение, число найденных точек и время обработки.
Как видим, в примере имеем один битый пиксель, светящийся красным.
   Вот, собственно, и все.


Canon EOS 5D. Full frame мне в руки! Первые впечатления.

По случаю купил подержанную тушку фотоаппарата Canon EOS 5D - полнокадровую зеркалку. В инете можно встретить и другое название фотоаппарата - "первый пятак".

Первые впечатления - он ОГРОМНЫЙ. По сравнению с мои Canon EOS 1100D - 5D ощутимо больше и тяжелее. Сверху на корпусе у пятерки присутствует ЖК экранчик, отображающий почти все необходимые для съемки параметры. И множество кнопочек, позволяющих быстро менять параметры съемки. Удобно, черт возьми.

Небольшое лирическое отступление про экранчик - по тому же случаю, в комплекте шел Canon EOS 40D - отдал его старшему ребенку. У 40D тоже есть сверху аналогичный экранчик и кнопочки - ребенок просто тихо млеет от удовольствия, почувствовав, как можно быстро менять любые настройки фотоаппарата. Почти год пытался подтолкнуть его к использованию домашнего Canon EOS 1100D и как-то без особого результата. А тут он как взял в руки 40D и все... Ковыряется в нем, изучает документацию, таскает фотик на улицу фотографировать одноклассниц и просто знакомых девчонок. Зацепила человека удобная, качественная техника. :) Чему я рад безмерно. :)

Но, вернемся к 5D. ISO у фотоаппарата - от 100 до 3200. Мало? Нормально! Обычно уже на ISO 400 начинают чувствоваться шумы, после ISO 600 шумы становятся просто неприличными. Для меня обычно рабочие ISO не выше 300, поэтому тут ничего не смутило.

Выдержка - 1/8000! Кстати, на 40D такая же выдержка. :) Короткая выдержка очень выручала при съемке движущихся объектов.

Малая ГРИП (глубина резко изображаемого пространства) делает портреты ощутимо выразительнее.

Имеются следующие режимы съемки: авто, ручной, приоритет диафрагмы (мой любимый), приоритет выдержки, пользовательский, программный.

Довольно быстрая серийная съемка - чуть больше 3 кадров в секунду. И серия в RAW до 17 кадров.Приятно.


Теперь немного о "минусах", или , точнее - особенностях, которые обратили на себя мое внимание.

Довольно быстро почувствовал отсутствие встроенной вспышки. Вроде, ерундовая вспышечка была у 1100D, но совсем без встроенной вспышки - ни тени смягчить при съемке в солнечную погоду, ни в сумерках подсветить... Понимаю, что на серьезной технике встроенных вспышек нет, но осадочек остался, да и расходы в будущем предстоят дополнительные.

Объективы. У меня не оказалось ни одного объектива с автофокусом, который встал бы на байонет EF. Только мануальные советские стекла с чипованным переходником. Похоже, меня ждет очередной приступ болезни покупки объективов. (Деньги!!! Куда вы?!!) :)

Малая ГРИП очень ощутима. Фокусироваться стало сложнее. Хотя даже на кропе со светосильной оптикой проблема ручной фокусировки будет присутствовать, поэтому оценил малую ГРИП как техническую особенность, к которой надо привыкнуть.

Нет видео. Я покупал фотоаппарат, чтобы фотографировать, поэтому отсутствие видео меня не расстроило, но для кого-то это может показаться недостатком.

Нет Live View - это ощутимо усложняет точную фокусировку. Думаю о приобретении насадки на видоискатель, увеличивающей картинку. В инете народ говорит, что отчасти помогает решать проблему.

12 мегапикселей - меня не смутили. Я отлично помню, какие замечательные фотографии делались на старенькую мыльницу с 4(!) мегапикселями.


В целом - доволен фотоаппаратом. Canon EOS 5D добротный фотоаппарат, который, на мой взгляд, не потерял актуальности и сможет еще не один год радовать хорошим качеством снимков. Если есть желание попробовать ФФ камеру, но имеются финансовые ограничения - Canon EOS 5D отличный вариант. Б/У камеру можно взять за 25-30 тысяч рублей. Но будьте готовы к расходам на объективы! Либо смотрите в сторону старых советских объективов, которые ставятся на зеркалку через адаптер и которые при отличном качестве оптики стоят в разы дешевле современной оптики. Кстати, светосильные объективы на 5D - рулят! Они позволяют раскрыться камере в полной мере и получать снимки, качество которых наполнит сердце радостью, а голову мыслями о том, что... хм... чем черт не шутит... может быть, в глубине души живет ВЕЛИКИЙ фотограф?! ;)

Для начинающих фотографов порекомендовал бы все-таки брать б/у Canon EOS 40D - на него встают объективы с байонетом EF-S, он чуть полегче, есть Live View, экранчик и дополнительные кнопки для быстрого доступа к настройкам, творческие режимы. Можно купить старенький но вполне еще актуальный фотоаппарат с полупрофессиональным управлением менее чем за 10 т.р.


У 5D и у 40D есть какой-то свой шарм. Приятные машинки, с душой. Рекомендую. :)


P.S.

Чуть позже выложу скрипт, позволяющий проверять матрицу на наличие "битых" пикселей. Да, автоматизировал процесс. Это болезнь. Я знаю. :))