Spaces:
Running
Running
Update app.py
Browse files
app.py
CHANGED
@@ -798,7 +798,7 @@ async def create_mask_sum(image: UploadFile = File(...), risk_level: int = Form(
|
|
798 |
@app.get("/", response_class=HTMLResponse)
|
799 |
async def read_root():
|
800 |
html_content = """
|
801 |
-
|
802 |
<html lang="ja">
|
803 |
<head>
|
804 |
<meta charset="UTF-8">
|
@@ -873,12 +873,10 @@ async def read_root():
|
|
873 |
<body>
|
874 |
<div class="container">
|
875 |
<h1><i class="fas fa-image"></i> 画像処理アプリ - モザイクとインペイント</h1>
|
876 |
-
|
877 |
<div class="form-group">
|
878 |
<input type="file" id="uploadImage" class="form-control-file" accept="image/*" onchange="previewImage()">
|
879 |
</div>
|
880 |
<img id="uploadedImage" class="image-preview" src="#" alt="アップロードされた画像" style="display: none;">
|
881 |
-
|
882 |
<div class="form-group mt-4">
|
883 |
<label for="processingType">処理方法を選択:</label>
|
884 |
<select id="processingType" class="custom-select">
|
@@ -888,33 +886,28 @@ async def read_root():
|
|
888 |
<option value="mosaic">mosaicインペイント</option>
|
889 |
</select>
|
890 |
</div>
|
891 |
-
|
892 |
<div class="slider-container">
|
893 |
<label for="riskLevel" class="slider-label">リスクレベル (0-100): <span id="riskLevelLabel">50</span></label>
|
894 |
<div id="slider"></div>
|
895 |
</div>
|
896 |
-
|
897 |
<button class="btn btn-primary mt-4" onclick="processImage()">処理開始</button>
|
898 |
-
|
899 |
<div id="result" class="mt-5">
|
900 |
<h2>処理結果:</h2>
|
901 |
<img id="processedImage" class="processed-preview" src="" alt="">
|
902 |
<a id="downloadLink" class="btn btn-success mt-3" href="#" download="processed_image.jpg">処理された画像をダウンロード</a>
|
903 |
</div>
|
904 |
</div>
|
905 |
-
|
906 |
<!-- jQuery and Bootstrap JS -->
|
907 |
<script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
|
908 |
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
|
909 |
<!-- jQuery UI -->
|
910 |
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
|
911 |
-
|
912 |
<script>
|
913 |
$(function() {
|
914 |
// スライダーの設定
|
915 |
$("#slider").slider({
|
916 |
range: "min",
|
917 |
-
value: 50,
|
918 |
min: 0,
|
919 |
max: 100,
|
920 |
slide: function(event, ui) {
|
@@ -926,74 +919,84 @@ async def read_root():
|
|
926 |
function previewImage() {
|
927 |
const fileInput = document.getElementById('uploadImage');
|
928 |
const uploadedImage = document.getElementById('uploadedImage');
|
929 |
-
|
930 |
if (fileInput.files && fileInput.files[0]) {
|
931 |
const reader = new FileReader();
|
932 |
reader.onload = function (e) {
|
933 |
-
|
934 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
935 |
};
|
936 |
reader.readAsDataURL(fileInput.files[0]);
|
937 |
}
|
938 |
}
|
939 |
|
940 |
function processImage() {
|
941 |
-
const fileInput = document.getElementById('uploadImage');
|
942 |
const processingType = document.getElementById('processingType').value;
|
943 |
-
const riskLevel = $("#slider").slider("value");
|
944 |
const resultDiv = document.getElementById('result');
|
945 |
const processedImage = document.getElementById('processedImage');
|
946 |
const downloadLink = document.getElementById('downloadLink');
|
|
|
947 |
|
948 |
-
if (
|
949 |
alert("画像を選択してください。");
|
950 |
return;
|
951 |
}
|
952 |
|
953 |
-
|
954 |
-
|
955 |
-
|
956 |
-
|
957 |
-
|
958 |
-
|
959 |
-
|
960 |
-
|
961 |
-
|
962 |
-
|
963 |
-
|
964 |
-
|
965 |
-
|
966 |
-
|
967 |
-
|
968 |
-
|
969 |
-
|
970 |
-
|
971 |
-
|
972 |
-
|
973 |
-
|
974 |
-
|
975 |
-
|
976 |
-
|
977 |
-
|
978 |
-
|
979 |
-
|
980 |
-
|
981 |
-
|
982 |
-
|
983 |
-
|
984 |
-
|
985 |
-
|
986 |
-
|
987 |
-
|
988 |
-
|
989 |
-
|
990 |
-
|
|
|
|
|
991 |
}
|
992 |
</script>
|
993 |
</body>
|
994 |
</html>
|
995 |
|
996 |
-
|
997 |
"""
|
998 |
return HTMLResponse(content=html_content)
|
999 |
if __name__ == "__main__":
|
|
|
798 |
@app.get("/", response_class=HTMLResponse)
|
799 |
async def read_root():
|
800 |
html_content = """
|
801 |
+
<!DOCTYPE html>
|
802 |
<html lang="ja">
|
803 |
<head>
|
804 |
<meta charset="UTF-8">
|
|
|
873 |
<body>
|
874 |
<div class="container">
|
875 |
<h1><i class="fas fa-image"></i> 画像処理アプリ - モザイクとインペイント</h1>
|
|
|
876 |
<div class="form-group">
|
877 |
<input type="file" id="uploadImage" class="form-control-file" accept="image/*" onchange="previewImage()">
|
878 |
</div>
|
879 |
<img id="uploadedImage" class="image-preview" src="#" alt="アップロードされた画像" style="display: none;">
|
|
|
880 |
<div class="form-group mt-4">
|
881 |
<label for="processingType">処理方法を選択:</label>
|
882 |
<select id="processingType" class="custom-select">
|
|
|
886 |
<option value="mosaic">mosaicインペイント</option>
|
887 |
</select>
|
888 |
</div>
|
|
|
889 |
<div class="slider-container">
|
890 |
<label for="riskLevel" class="slider-label">リスクレベル (0-100): <span id="riskLevelLabel">50</span></label>
|
891 |
<div id="slider"></div>
|
892 |
</div>
|
|
|
893 |
<button class="btn btn-primary mt-4" onclick="processImage()">処理開始</button>
|
|
|
894 |
<div id="result" class="mt-5">
|
895 |
<h2>処理結果:</h2>
|
896 |
<img id="processedImage" class="processed-preview" src="" alt="">
|
897 |
<a id="downloadLink" class="btn btn-success mt-3" href="#" download="processed_image.jpg">処理された画像をダウンロード</a>
|
898 |
</div>
|
899 |
</div>
|
|
|
900 |
<!-- jQuery and Bootstrap JS -->
|
901 |
<script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
|
902 |
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
|
903 |
<!-- jQuery UI -->
|
904 |
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
|
|
|
905 |
<script>
|
906 |
$(function() {
|
907 |
// スライダーの設定
|
908 |
$("#slider").slider({
|
909 |
range: "min",
|
910 |
+
value: 50,
|
911 |
min: 0,
|
912 |
max: 100,
|
913 |
slide: function(event, ui) {
|
|
|
919 |
function previewImage() {
|
920 |
const fileInput = document.getElementById('uploadImage');
|
921 |
const uploadedImage = document.getElementById('uploadedImage');
|
|
|
922 |
if (fileInput.files && fileInput.files[0]) {
|
923 |
const reader = new FileReader();
|
924 |
reader.onload = function (e) {
|
925 |
+
const img = new Image();
|
926 |
+
img.onload = function() {
|
927 |
+
const canvas = document.createElement('canvas');
|
928 |
+
const ctx = canvas.getContext('2d');
|
929 |
+
canvas.width = 640;
|
930 |
+
canvas.height = 480;
|
931 |
+
ctx.drawImage(img, 0, 0, 640, 480);
|
932 |
+
uploadedImage.src = canvas.toDataURL('image/jpeg');
|
933 |
+
uploadedImage.style.display = 'block';
|
934 |
+
uploadedImage.dataset.resizedImage = uploadedImage.src;
|
935 |
+
};
|
936 |
+
img.src = e.target.result;
|
937 |
};
|
938 |
reader.readAsDataURL(fileInput.files[0]);
|
939 |
}
|
940 |
}
|
941 |
|
942 |
function processImage() {
|
|
|
943 |
const processingType = document.getElementById('processingType').value;
|
944 |
+
const riskLevel = $("#slider").slider("value");
|
945 |
const resultDiv = document.getElementById('result');
|
946 |
const processedImage = document.getElementById('processedImage');
|
947 |
const downloadLink = document.getElementById('downloadLink');
|
948 |
+
const resizedImageDataURL = document.getElementById('uploadedImage').dataset.resizedImage;
|
949 |
|
950 |
+
if (!resizedImageDataURL) {
|
951 |
alert("画像を選択してください。");
|
952 |
return;
|
953 |
}
|
954 |
|
955 |
+
fetch(resizedImageDataURL)
|
956 |
+
.then(res => res.blob())
|
957 |
+
.then(blob => {
|
958 |
+
const formData = new FormData();
|
959 |
+
formData.append('image', blob, 'resized_image.jpg');
|
960 |
+
formData.append('risk_level', riskLevel);
|
961 |
+
|
962 |
+
let apiEndpoint;
|
963 |
+
if (processingType === "opencv") {
|
964 |
+
apiEndpoint = "/create-mask-and-inpaint-opencv";
|
965 |
+
} else if (processingType === "simple_lama") {
|
966 |
+
apiEndpoint = "/create-mask-and-inpaint-simple-lama";
|
967 |
+
} else if (processingType === "stamp") {
|
968 |
+
apiEndpoint = "/create-mask-and-inpaint-stamp";
|
969 |
+
} else if (processingType === "mosaic") {
|
970 |
+
apiEndpoint = "/create-mask-and-inpaint-mosaic";
|
971 |
+
}
|
972 |
+
const url = "https://rein0421-aidentify.hf.space" + apiEndpoint;
|
973 |
+
|
974 |
+
fetch(url, {
|
975 |
+
method: 'POST',
|
976 |
+
body: formData
|
977 |
+
})
|
978 |
+
.then(response => {
|
979 |
+
if (!response.ok) {
|
980 |
+
throw new Error("Network response was not ok");
|
981 |
+
}
|
982 |
+
return response.blob();
|
983 |
+
})
|
984 |
+
.then(blob => {
|
985 |
+
const objectURL = URL.createObjectURL(blob);
|
986 |
+
processedImage.src = objectURL;
|
987 |
+
downloadLink.href = objectURL;
|
988 |
+
resultDiv.style.display = "block";
|
989 |
+
})
|
990 |
+
.catch(error => {
|
991 |
+
console.error("画像処理に失敗しました。", error);
|
992 |
+
alert("画像処理に失敗しました。");
|
993 |
+
});
|
994 |
+
});
|
995 |
}
|
996 |
</script>
|
997 |
</body>
|
998 |
</html>
|
999 |
|
|
|
1000 |
"""
|
1001 |
return HTMLResponse(content=html_content)
|
1002 |
if __name__ == "__main__":
|