Фото С Вебкамеры В Richtext

Тема в разделе "Lotus - Программирование", создана пользователем dimat, 30 сен 2014.

  1. dimat

    dimat Lotus team
    Lotus team

    Регистрация:
    31 июл 2008
    Сообщения:
    518
    Симпатии:
    0
    Всем привет!
    Собственно есть у кого идеи как по нажатию кнопки на форме(для примера) сделать снимок на вебкамеру и запихнуть фото в RichText как картинку(не как вложение)? Это задача максимум.
    Задача минимум: по кнопке выбрать файл фотографии и вставить ее в Richtext.
     
  2. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.052
    Симпатии:
    146
    dimat
    Чтобы по кнопке из файла вставить фото, как картинку:
    Код ( (Unknown Language)):
    @Command([EditGotoField];"FOTO");
    @PostedCommand([FileImport])
    А вот с камеры... наверное через API в буфер картинку сохранить и потом вставить из буфера.
     
  3. dimat

    dimat Lotus team
    Lotus team

    Регистрация:
    31 июл 2008
    Сообщения:
    518
    Симпатии:
    0
    savl Спасибо.
    В буфер имеется ввиду виндовый?
    Через api Прог. обеспечения Камеры?

    да и, если просто вставить картинку по нажатию кнопки, хотелось бы изменить ее размер это уже наверное через dxl как то?
     
  4. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.052
    Симпатии:
    146
    Ну в целом да, с камеры не просто так.
    Нативный драйвер для windows
    Еще вариант через софт от камеры, COM скорее всего, либо внешняя DLL
    webcam snapshots and lotus/domino


    Добавлено: Про размер... Ну да, через DXL можно поменять.
     
  5. alexas1

    alexas1 Lotus team
    Lotus team

    Регистрация:
    10 апр 2014
    Сообщения:
    567
    Симпатии:
    214
    Там avicap32, лучше использовать DirectShow, имхо.
    Или WindowsMediaCapture, если JS ближе по духу.
    И на первое и на второе куча описалова, в том числе и на русском.
     
  6. dimat

    dimat Lotus team
    Lotus team

    Регистрация:
    31 июл 2008
    Сообщения:
    518
    Симпатии:
    0
    alexas1
    Не совсем понимаю, вернее совсем не понимаю, как их использовать?
     
  7. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.081
    Симпатии:
    300
    камеры д.б. UVC http://en.wikipedia.org/wiki/List_of_USB_video_class_devices
    это шобы с дровами не долбаться
    затем http://stackoverflow.com/questions/276292/...-webcam-in-java
    или http://webcam-capture.sarxos.pl/ (на стековерфлоу упоминается)
    суваем файло в DXL, кажем юзверю
    вот ежели понадобится морду выцеливать - нужно тоды аплет сувать либо окно со свингом
     
  8. alexas1

    alexas1 Lotus team
    Lotus team

    Регистрация:
    10 апр 2014
    Сообщения:
    567
    Симпатии:
    214
    Это проблема.

    Тогда c другой стороны, c примерами и проще:<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">В классике на LS</div></div><div class="sp-body"><div class="sp-content">
    Код (Text):
    Set devmgr = createobject( "WIA.DeviceManager")

    For c = 1 To devmgr.DeviceInfos.Count
    If devmgr.DeviceInfos( c).Type = 2 Or devmgr.DeviceInfos( c).Type = 3 Then ' 2 = Camera, 3 = Video
    Set dev = devmgr.DeviceInfos( c).Connect()
    Set cdg = Createobject( "WIA.CommonDialog")

    ' First remove all buffered images from previous sessions
    TempPath$ = dev.Properties( 24).Value
    TempFilter$ = TempPath$ + "\*.jpg"
    fileName$ = Dir$( TempFilter$, 0)
    Do While fileName$ <> ""
    Kill TempPath$ + "\" + fileName$
    fileName$ = Dir$()
    Loop

    Set cdg = Createobject( "WIA.CommonDialog")
    Set img = cdg.ShowAcquireImage( _
    3, _
    1, _
    65536, _
    "{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}", _
    0, _
    0, _
    0)

    ' Resize the captured image
    Set IP = CreateObject("WIA.ImageProcess")
    IP.Filters.Add IP.FilterInfos("Scale").FilterID
    IP.Filters(1).Properties("MaximumWidth") = 200
    IP.Filters(1).Properties("MaximumHeight") = 100
    Set Img = IP.Apply(Img)

    If img Is Nothing Then ' they clicked cancel
    Exit Sub
    End If

    ' save the pic to hard disk with the filename D09679A7EF130E7988256FF4000A5265-08-18-2009 03-46-42 PM PDT.jpg
    ' where those first 32 chars are what's in the DOCID field of the currently open document
    Dim dtNow As New NotesDateTime( Now)
    strDate$ = dtNow.LocalTime
    varDate = Evaluate( |@ReplaceSubstring( "| + strDate$ + |"; ":" : "/"; "-")|)
    strDate$ = Cstr( varDate( 0))
    Dim uidoc As NotesUIDocument
    Dim ws As New NotesUIWorkspace
    Set uidoc = ws.CurrentDocument
    Dim strFilePath As String

    strFilePath = session.GetEnvironmentString( "MyAppTempDirPath") + "\" + uidoc.Document.DOCID( 0) + "-" + strDate$ + ".jpg"
    Call img.SaveFile( strFilePath)


    Call uidoc.GotoField( "Picture")
    Call uidoc.Import( "JPEG Image", strFilePath)
    intID = Shell( |cmd /c del "| + strFilePath + |"|)  ' delete the temp file from hard disk
    Call uidoc.GotoNextField


    Exit For ' no need to look for any more devices
    End If
    Next c
    Эта штука будет работать на winXP & win8 - в висте и семёрке wiaaut.dll нету, соответственно бубен в руки
    Что бы работало, надо, как минимум, чтобы устройство отобразилось в "Сканерах и камерах" Панели управления Windows.
    Хорошие примеры с микрософта про WIA
    ===================================================================
    Ещё из закромов (PlanetLotus вроде)<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Capturing image from camera using getUserMedia() and saving it in a document using XPages</div></div><div class="sp-body"><div class="sp-content">Naveen Maurya

    HTML5 introduces a new API navigator.getUserMedia() which allows web applications to access a user’s camera and microphone. This article on HTML5 Rocks and this question on StackOverflow describe how to use it in your web applications.

    In this article I will describe how to use navigator.getUserMedia() in your XPage and save the captured image in your Notes document. As of now this demo is supported only on Google Chrome & Mozilla Firefox on desktop and mobile (I have tested it on Andorid only).

    HTML5 introduces <video> tag which allow developers access to user’s camera.

    <video id="video" style="height:240px;width:320px" autoplay="true"></video>
    Next we need to add <canvas> tag and an <image> tag. The image captured from user’s camera is drawn on to <canvas>. We then get the Base64 encoded image from <canvas> put it into our <image> (JavaScript code to do that comes later in article).

    <canvas id="canvas" style="display: none; height:240px; width:320px"></canvas>
    <xp:image url="/.ibmxspres/dojoroot/dojo/resources/blank.gif" id="capturedImage" style="height:240px;width:320px"></xp:image>
    Notice that the <canvas> is hidden.

    I am also going to add a text area to my XPage where I will store the Base64 encoded text of the captured image which later would be converted into image using Java (code for that comes later in article). While developing applications you can hide this text area using CSS.

    <xp:inputTextarea id="taImageBase64"></xp:inputTextarea>
    And finally we need a button to take snapshot from camera.

    <xp:button id="btnCapture" value="Fire up my camera!"></xp:button>
    In our JavaScript code we initialize all the variables we would be using.

    var video = document.getElementById("video"); // Video
    var canvas = document.getElementById("canvas"); // Canvas
    var ctx = canvas.getContext("2d"); // Used to draw image from video stream on to canvas
    var localMediaStream = null;
    var capturedImage = document.getElementById("#{id:capturedImage}"); // Image
    To get the video stream from camera we use navigator.getUserMedia. As of now navigator.getUserMedia is vendor prefixed so we test which one is supported.

    // Get the video from the webcam, this is currently prefixed for different browsers, so we need to test which one is supported
    navigator.getMedia = (navigator.getUserMedia || navigator.webkitGetUserMedia
    || navigator.mozGetUserMedia || navigator.msGetUserMedia);
    Now we need to turn on the camera, get the video stream and show it in <video> tag. The code to get the video stream slightly differs from browser to browser.

    navigator.getMedia({
    video : true,
    audio : false // We do NOT require audio
    }, function(stream) {
    if (navigator.mozGetUserMedia) { // For Firefox
    video.mozSrcObject = stream;
    } else { // For Chrome
    var vendorURL = window.webkitURL || window.URL;
    video.src = vendorURL.createObjectURL(stream);
    }
    video.play(); // Start the video in webcam
    localMediaStream = stream; // Store the video stream
    button.textContent = "Say Cheese!";
    }, function(e) {
    alert("An error occured! " + (e.name || e));
    });
    Once we have the video stream we can draw it on our <canvas>. While drawing we need to make sure that the height and width of our <video> and <canvas> are set to same dimensions otherwise the drawn image gets cropped. To get the Base64 encoded text for image we use canvas.toDataURL.

    // Draw on canvas
    canvas.width = video.videoWidth;
    canvas.height = video.videoHeight;

    // Draw on image
    capturedImage.height = video.videoHeight;
    capturedImage.width = video.videoWidth;
    ctx.drawImage(video, 0, 0);// , width, height);
    var imageData = canvas.toDataURL("image/png"); // Gets the Base64 encoded text for image
    capturedImage.src = imageData;

    // Store the Base64 of captured image
    document.getElementById("#{id:taImageBase64}").value = imageData;
    So our final code for button looks something like this:

    var button = document.getElementById("#{id:btnCapture}");
    button.addEventListener("click", function(e) {
    // Check if browser is supported
    if (!navigator.getMedia) {
    alert("Your browser does not support video stream.");
    return;
    }

    // If the video stream is working
    if (localMediaStream) {
    // Draw on canvas
    canvas.width = video.videoWidth;
    canvas.height = video.videoHeight;

    // Draw on image
    capturedImage.height = video.videoHeight;
    capturedImage.width = video.videoWidth;
    ctx.drawImage(video, 0, 0);
    var imageData = canvas.toDataURL("image/png"); // Gets the Base64 encoded text for image
    capturedImage.src = imageData;

    // Store the Base64 of captured image
    document.getElementById("#{id:taImageBase64}").value = imageData;
    return;
    }

    // If video stream is NOT working
    navigator.getMedia({
    video : true,
    audio : false // We do NOT require audio
    }, function(stream) {
    if (navigator.mozGetUserMedia) {
    video.mozSrcObject = stream;
    } else {
    var vendorURL = window.webkitURL || window.URL;
    video.src = vendorURL.createObjectURL(stream);
    }
    video.play(); // Start the video in webcam
    localMediaStream = stream; // Store the video stream
    button.textContent = "Say Cheese!";
    }, function(e) {
    alert("An error occured! " + (e.name || e));
    });
    }, false);
    Now we need to convert the Base64 text to image and attach it to our document. For converting Base64 to image we create a Java class and use javax.xml.bind.DatatypeConverter.parseBase64Binary to convert it to binary and then we can attach it to a rich text field in document.

    package uk.co.pipalia;

    import java.io.ByteArrayInputStream;
    import javax.faces.context.FacesContext;
    import javax.faces.el.ValueBinding;
    import javax.xml.bind.DatatypeConverter;
    import lotus.domino.Document;
    import lotus.domino.MIMEEntity;
    import lotus.domino.MIMEHeader;
    import lotus.domino.Session;
    import lotus.domino.Stream;
    import com.ibm.xsp.model.domino.DominoUtils;
    import com.ibm.xsp.page.compiled.ExpressionEvaluatorImpl;

    public class SaveBase64Image {
    Document targetDoc;
    String b64String;

    public SaveBase64Image(Document targetDoc) {
    // Get the value stored in text area
    String valueExpr = "#{java script: getComponent("taImageBase64").getValue();}";
    FacesContext facesContext = FacesContext.getCurrentInstance();
    ExpressionEvaluatorImpl evaluator = new ExpressionEvaluatorImpl(facesContext);
    ValueBinding vb = evaluator.createValueBinding(facesContext.getViewRoot(), valueExpr, null, null);
    b64String = (String) vb.getValue(facesContext);

    this.targetDoc = targetDoc;
    b64String = b64String.replace("data:image/png;base64,", "");
    }

    public void process() {
    if (b64String.trim().equals("")) {
    return;
    }

    try {
    // Convert the Base64 string to binary
    byte[] imgBytes = DatatypeConverter.parseBase64Binary(b64String);

    Session s = DominoUtils.getCurrentSession();
    s.setConvertMime(false);

    // Create MIME to store the image
    MIMEEntity richtext = targetDoc.createMIMEEntity("CapturedImage");
    MIMEHeader header = richtext.createHeader("Content-Type");
    header.setHeaderVal("multipart/mixed");

    MIMEEntity child = richtext.createChildEntity();
    header = child.createHeader("Content-Disposition");
    header.setHeaderValAndParams("attachment; filename=camerasnap.png");

    // Add the image to MIME via stream
    Stream stream = s.createStream();
    stream.setContents(new ByteArrayInputStream(imgBytes));
    child.setContentFromBytes(stream, "image/png", MIMEEntity.ENC_IDENTITY_BINARY);

    stream.close();
    s.setConvertMime(true);
    } catch (Exception e) {
    System.out.println("Error in uk.co.pipalia.SaveBase64Image.process()");
    e.printStackTrace();
    }
    }
    }
    We call this Java class from querySaveDocument event.

    <xp:this.data>
    <xp:dominoDocument var="cameraImgDoc" formName="fCameraImage">
    <xp:this.querySaveDocument><![CDATA[#{java script:var saveImage:uk.co.pipalia.SaveBase64Image = new uk.co.pipalia.SaveBase64Image(currentDocument.getDocument());
    saveImage.process();}]]></xp:this.querySaveDocument>
    </xp:dominoDocument>
    </xp:this.data>
    And we ready to take snaps from our webcam.

    When you click on the button “Fire up my camera!” browser will ask for your permission. Once the permission is granted you can see your video and take snaps.
    Это работает в Хроме и Мозиле. В нотусёвом браузере нет.
    Посмотреть вложение CameraAPIDemo.zip
    ===============================================================
    Ещё EZTwain тоже с камерой должен дружить
    Тут ребята обсуждали
    Примеры для сканера, но это не суть...
     
  9. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.081
    Симпатии:
    300
  10. dimat

    dimat Lotus team
    Lotus team

    Регистрация:
    31 июл 2008
    Сообщения:
    518
    Симпатии:
    0
    Офигеть сколько всего, спасибо, буду пробовать разбираться.
     
Загрузка...

Поделиться этой страницей