<!DOCTYPE html>
<html>
<head>
<title>영상처리</title>
<link rel="stylesheet" type="text/css" href="style.css"/>
<script>
let inCanvas, inCtx, inPaper;
let outCanvas, outCtx, outPaper;
let inImage, inH, inW;
let outImage, outH, outW;
let inFile;
function init() {
inCanvas = document.getElementById("inCanvas");
inCtx = inCanvas.getContext("2d");
outCanvas = document.getElementById("outCanvas");
outCtx = outCanvas.getContext("2d");
}
function openImage() {
inFile = document.getElementById("inFile").files[0];
inH = inW = Math.sqrt(inFile.size);
inImage = new Array(inH);
for(let i=0; i<inH; i++)
inImage[i] = new Array(inW);
let reader = new FileReader();
reader.readAsBinaryString(inFile);
reader.onload = function () {
let blob = reader.result;
for (let i=0; i<inH; i++) {
for (let k=0; k<inW; k++) {
let sPixel = (i*inH + k);
let ePixel = (i*inH + k) + 1;
inImage[i][k] = blob.slice(sPixel,ePixel).charCodeAt(0);
}
}
inCanvas.height = inH;
inCanvas.width = inW;
inPaper= inCtx.createImageData(inH, inW);
for (let i=0; i<inH; i++) {
for (let k=0; k<inW; k++) {
let px = inImage[i][k];
inPaper.data[(i*inH + k)*4 + 0] = px;
inPaper.data[(i*inH + k)*4 + 1] = px;
inPaper.data[(i*inH + k)*4 + 2] = px;
inPaper.data[(i*inH + k)*4 + 3] = 255;
}
}
inCtx.putImageData(inPaper,0,0);
}
}
function displayImage() {
outCanvas.height = outH;
outCanvas.width = outW;
outPaper= outCtx.createImageData(outH, outW);
for (let i=0; i<outH; i++) {
for (let k=0; k<outW; k++) {
let px = outImage[i][k];
outPaper.data[(i*outH + k)*4 + 0] = px;
outPaper.data[(i*outH + k)*4 + 1] = px;
outPaper.data[(i*outH + k)*4 + 2] = px;
outPaper.data[(i*outH + k)*4 + 3] = 255;
}
}
outCtx.putImageData(outPaper,0,0);
}
function selectAlgorithm(selNum) {
switch (parseInt(selNum.value)) {
case 101 :
equalImage(); break;
case 102 :
reverseImage(); break;
case 103 :
addImage(); break;
case 104 :
subImage(); break;
case 105 :
mulImage(); break;
case 106 :
divImage(); break;
case 107 :
black127Image(); break;
case 108 :
blackAvgImage(); break;
case 109 :
pbCapImage(); break;
case 110 :
pbCupImage(); break;
case 111 :
gammaImage(); break;
case 201 :
upDownImage(); break;
case 202 :
leftRightImage(); break;
case 203 :
zoomOutImage(); break;
case 204 :
zoomInImage(); break;
case 205 :
moveImage(); break;
case 206 :
rotate1Image(); break;
case 207 :
rotate2Image(); break;
case 301 :
embossImage(); break;
case 302 :
blurrImage(); break;
case 303 :
gaussianImage(); break;
case 304 :
sharpeningImage(); break;
case 305 :
highSharpeningImage(); break;
case 306 :
lowSharpeningImage(); break;
case 307 :
boundaryImage(); break;
case 308 :
homogenImage(); break;
case 309 :
differenceImage(); break;
case 310 :
LoGImage(); break;
case 311 :
DoGImage(); break;
case 312 :
laplacianImage(); break;
case 313 :
robertsImage(); break;
case 314 :
sobelImage(); break;
case 315 :
prewittImage(); break;
case 401 :
stretchImage(); break;
case 402 :
endInImage(); break;
case 403 :
equalizeImage(); break;
}
}
</script>
</head>
<body onload="init()" class="edit">
<div class="head">Photo Editor</div><br>
<center><form>
<div class="filebox"> <label for="inFile">파일 선택</label>
<input type="file" id="inFile" onchange="openImage()"/></div> <br><br>
<div class="selectbox"><select name='pixel' onchange = "selectAlgorithm(this.form.pixel)">
<option value="0"> 화소점 처리 </option>
<optgroup>
<option value=101> 동일 영상 </option>
<option value=102> 영상 반전 </option>
<option value=103> 밝게하기 </option>
<option value=104> 어둡게하기 </option>
<option value=105> 곱하기 </option>
<option value=106> 나누기 </option>
<option value=107> 흑백(127기준) </option>
<option value=108> 흑백(평균기준) </option>
<option value=109> 파라볼라(캡) </option>
<option value=110> 파라볼라(컵) </option>
<option value=111> 감마 </option>
</optgroup>
</select>
<select name="geometry" onchange = "selectAlgorithm(this.form.geometry)">
<option value="0"> 기하학 처리 </option>
<optgroup>
<option value="201"> 상하 미러링 </option>
<option value="202"> 좌우 미러링 </option>
<option value="203"> 축소하기 </option>
<option value="204"> 확대하기 </option>
<option value="205"> 이동하기 </option>
<option value="206"> 회전하기 </option>
<option value="207"> 회전하기(원본크기) </option>
</optgroup>
</select>
<select name="area" onchange = "selectAlgorithm(this.form.area)">
<option value="0"> 화소영역 처리 </option>
<optgroup>
<option value="301"> 엠보싱 </option>
<option value="302"> 블러링 </option>
<option value="303"> 가우시안 필터 </option>
<option value="304"> 샤프닝 </option>
<option value="305"> 고주파 필터 샤프닝 </option>
<option value="306"> 저주파 필터 샤프닝 </option>
<option value="307"> 경계선검출 </option>
<option value="308"> 유사 연산자 </option>
<option value="309"> 차 연산자 </option>
<option value="310"> LoG </option>
<option value="311"> DoG </option>
<option value="312"> 라플라시안 </option>
<option value="313"> 로버츠 </option>
<option value="314"> 소벨 </option>
<option value="315"> 프리윗 </option>
</optgroup>
</select>
<select name="histo" onchange = "selectAlgorithm(this.form.histo)">
<option value="0"> 히스토그램 처리 </option>
<optgroup>
<option value="401"> 스트래칭 </option>
<option value="402"> 앤드-인 </option>
<option value="403"> 평활화 </option>
</optgroup>
</select></div>
</form>
<table border="1">
<th>Before</th>
<th>After</th>
<tr><td>
<canvas id="inCanvas" style="background-color:lightblue"></canvas>
</td><td>
<canvas id="outCanvas" style="background-color:lightsteelblue"></canvas>
</center>
</body>
</html>