JavaFX中的中心裁剪图像

时间:2017-07-24 06:48:13

标签: java css image javafx

我正熟悉Javafx并直接从包装盒中注意到它缺少scaletypes,在Android中我们称之为<?php $thumbs_dir = 'E:/xampp/htdocs/uploads/thumbs/'; $videos = array(); if (isset($_POST["name"])) { if (!preg_match('/data:([^;]*);base64,(.*)/', $_POST['data'], $matches)) { die("error"); } $data = $matches[2]; $data = str_replace(' ', '+', $data); $data = base64_decode($data); $file = 'text.jpg'; $dataname = file_put_contents($thumbs_dir . $file, $data); } ?> //jscode <script type="text/javascript"> var videos = <?= json_encode($videos); ?>; var video = document.getElementById('video'); video.addEventListener('canplay', function () { this.currentTime = this.duration / 2; }, false); var seek = true; video.addEventListener('seeked', function () { if (seek) { getThumb(); } }, false); function getThumb() { seek = false; var filename = video.src; var w = video.videoWidth;//video.videoWidth * scaleFactor; var h = video.videoHeight;//video.videoHeight * scaleFactor; var canvas = document.createElement('canvas'); canvas.width = w; canvas.height = h; var ctx = canvas.getContext('2d'); ctx.drawImage(video, 0, 0, w, h); var data = canvas.toDataURL("image/jpg"); var xmlhttp = new XMLHttpRequest; xmlhttp.onreadystatechange = function () { if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { } } xmlhttp.open("POST", location.href, true); xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); xmlhttp.send('name=' + encodeURIComponent(filename) + '&data=' + data); } function failed(e) { // video playback failed - show a message saying why switch (e.target.error.code) { case e.target.error.MEDIA_ERR_ABORTED: console.log('You aborted the video playback.'); break; case e.target.error.MEDIA_ERR_NETWORK: console.log('A network error caused the video download to fail part-way.'); break; case e.target.error.MEDIA_ERR_DECODE: console.log('The video playback was aborted due to a corruption problem or because the video used features your browser did not support.'); break; case e.target.error.MEDIA_ERR_SRC_NOT_SUPPORTED: console.log('The video could not be loaded, either because the server or network failed or because the format is not supported.'); break; default: console.log('An unknown error occurred.'); break; } } </script> //Html <div> <video id="video" src="1499752288.mp4" autoplay="true" onerror="failed(event)" controls="controls" preload="none"></video> </div> ,当图像较小或较大或尺寸比不等于您的imageview时它缩放图像并根据图像视图尺寸裁剪它,在Javafx我做不到,有没有人知道实现它的方法?

1 个答案:

答案 0 :(得分:2)

您可以使用剪贴蒙版来实现裁剪部分。 每个Node都有方法public final void setClip(Node value),它允许您使用另一个节点作为掩码。

通过将setClip与ImageView一起使用并将一些Bindings与宽度和高度组合,您应该能够实现自己的类,其行为符合您的描述。

更新: 好的,再次检查后,看起来问题已经提出:Center crop image JavaFX

那里提供的代码应该可以解决您的问题。我在这里复制它以便于参考。

double newMeasure = (userImage.getImage().getWidth() < userImage.getImage().getHeight()) ? userImage.getImage().getWidth() : userImage.getImage().getHeight();
double x = (userImage.getImage().getWidth() - newMeasure) / 2;
double y = (userImage.getImage().getHeight() - newMeasure) / 2;  

Rectangle2D rect = new Rectangle2D(x, y, newMeasure, newMeasure);
userImage.setViewport(rect);
userImage.setFitWidth(150);
userImage.setFitHeight(150);
userImage.setSmooth(true);