EDSDK LiveView увеличить в 10 раз
Использование LiveView на EOS - это весело и помогает сфокусироваться на объектах (в случае задач, которые не обеспечивают автофокусировку). Увеличение изображения (потока) LiveView действительно помогает фокусироваться.
На сайте камеры вы можете увеличить изображение LiveView в 5 и 10 раз, используя кнопку со значком увеличительного стекла. Это хорошо работает для моего 600D.
Программирование с использованием EDSDK У меня возникла проблема: можно установить режим 5-кратного увеличения для LiveView программным способом. Но мне не удалось 10x режим.
Удалось ли кому-нибудь увеличить масштаб LiveView и увеличить изображение LiveView более чем в 5 раз?
Для успешного 5-кратного увеличения LiveView я использовал следующий код для моего 600D:
// Запускаем LiveView, ожидаем появления потока на экране и затем делаем:
_iZoomStage = 5;
bool Success = _CameraHandler.SetSetting (EDSDK.PropID_Evf_Zoom, (UInt32) _iZoomStage);
Это прекрасно работает, НО: если вы попытаетесь получить более высокий коэффициент масштабирования, который не удастся. Успешное завершение возвращается, но никакого эффекта не видно на экране. Если вы выполняете масштабирование LiveView на самой камере, то 10-кратное работает нормально, нажав кнопку "лупа". Но программно я не преуспел в значениях больше 5.
Есть идеи на эту тему?
2 ответа
Что ж, большое спасибо за ваши ответы.
Тем временем я сделал следующий обходной путь, который, кажется, решил проблему. Я просто обрезаю и увеличиваю растровое изображение во время потоковой передачи LiveView:
if(_zoomFactorOfEdskd == true) // That is 1 and 5
g.DrawImage(_LiveViewStreamedBmp,_LvOutput);
else // Our own ones which do not work with EDSDK
{
Int32 newWidth= (Int32)(_LiveViewStreamedBmp.Width / _zoomFactor);
Int32 newHeight= (Int32)(_LiveViewStreamedBmp.Height / _zoomFactor);
// Cropping around the center of the original bitmap
Int32 xOffset= (_LiveViewStreamedBmp.Width-newWidth)/2;
Int32 yOffset= (_LiveViewStreamedBmp.Height-newHeight)/2;
Rectangle rectSource=new Rectangle(xOffset, xOffset, newWidth,newHeight);
Rectangle rectTarget=new Rectangle( 0, 0, _LiveViewStreamedBmp.Width, _LiveViewStreamedBmp.Height);
// Do the zoomed output...
g.DrawImage(_LiveViewStreamedBmp,rectTarget,rectSource,GraphicsUnit.Pixel);
}
Пожалуйста, позаботьтесь о том, чтобы "действительно хорошие" результаты появлялись при _zoomFactor ниже 5x (что означает что-то между 2.0 и 3.0). Если вы используете здесь слишком сильные значения масштабирования, вы получите "пиксели", а изображение слишком большого размера (вы можете ничего не увидеть).
Возможно, было бы неплохо определить значение _zoomFactor в противном случае, чтобы оно лучше подходило для понимания Canon "5x" или "10x". Но на данный момент этот обходной путь может служить.
С уважением, Герхард Кауэр
Я столкнулся с той же проблемой (на 5D Mark IV) - на самом деле возможно только 5-кратное увеличение, а для 10-кратного увеличения вы должны сами увеличить возвращаемое растровое изображение.
ОДНАКО: Кажется, это не ошибка, а очень плохо документированная функция (т.е. вообще не документирована). SDK фактически выдает дополнительные данные, намекающие на то, что вам следует сделать программный зум, а также дает точные координаты. Вот как я это понимаю:
Скажем, у нас есть датчик с разрешением 1000 x 1000 пикселей, и мы хотим увеличить его в 10 раз по центру. Тогда это происходит в моих тестах:
- Чтение
kEdsPropID_Evf_ZoomRect
возвращает позицию 450:450 и размер 100х100 - все как положено. - Чтение
kEdsPropID_Evf_ZoomPosition
возвращает 450:450 - ожидается тоже. - Но вы получите растровое изображение размером 200 x 200 пикселей - "неправильно", потому что это для увеличения x5... вы ожидаете 100 x 100, но это наблюдалось на разных камерах, так что, вероятно, это нормальная вещь.
- Но, читая
kEdsPropID_Evf_ImagePosition
Вы можете сказать, где на самом деле лежит этот точечный рисунок. Это вернет позицию 400:400 и может быть использовано для расчета окончательного кадрирования и увеличения возвращенного растрового изображения.
Таким образом, хотя код пользователя 3856307 должен работать, камера может иметь некоторые ограничения (например, возвращать растровые изображения в позиции, кратной 32), поэтому включение kEdsPropID_Evf_ImagePosition
должен дать более точные результаты по моему мнению.