JSP

서버 스크립트 2일차

구자룡 2021. 4. 27. 17:18

영상처리 방법!

 

Client

<%@ page language="java" contentType="text/html; charset=EUC-KR"

pageEncoding="EUC-KR"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title>Insert title here</title>

</head>

<body>

​

<form name="fileForm" method='post' enctype ='multipart/form-data' 

action='photo_server.jsp'>

<p> 입력파일명:<input type="file" name="inFile">

<p> 출력파일명:<input type="text" name="outFile">

​

<p> <select name="algo">

<option value="">-----선택------</option>

<option value="1">반전처리</option>

<option value="2">밝게하기</option>

<option value="3">어둡게하기</option>

<option value="4">흑백처리</option>

<option value="5">확대하기</option>

<option value="6">축소하기</option>

<option value="7">회전하기</option>

<option value="8">엠보싱</option>

<option value="9">블러링</option>

</select>

<p> 파라미터:<input type="text" name="parameter">

<p> <input type="submit" value="처리하기">

</form>

​

</body>

</html>

server

<%@ page language="java" contentType="text/html; charset=EUC-KR"

pageEncoding="EUC-KR"%>

<%@ page import="com.oreilly.servlet.*"%>

<%@ page import="com.oreilly.servlet.multipart.*"%>

<%@ page import="java.util.*"%>

<%@ page import="java.io.*"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title>Insert title here</title>

</head>

<body>

<% 

MultipartRequest multi = new MultipartRequest(request, "C:/upload",

5*1024*1024, "utf-8", new DefaultFileRenamePolicy());


String tmp;

String outFile = multi.getParameter("outFile");

String algo = multi.getParameter("algo");

String parameter = multi.getParameter("parameter");


Enumeration files = multi.getFileNames();

tmp = (String) files.nextElement();

String inFile = multi.getOriginalFileName(tmp);


// 영상처리 프로그램 기본 처리

// lena256.raw 파일을 읽어서, 영상처리 알고리즘에 의해서 처리한후, 결과를 저장하기..

// (1) JSP에서 파일 처리

int inW, inH, outW=0, outH=0;


File inFp;

FileInputStream inFs;

inFp = new File("C:/PC_Photo/" + inFile);

long fLen=inFp.length();

inH=inW=(int)Math.sqrt(fLen);


inFs = new FileInputStream(inFp.getPath());

// (2) JSP에서 배열 처리

int[][] inImage = new int[inH][inW]; // 메모리 할당

// 파일 --> 메모리

for (int i=0; i<inH; i++) {

for (int k=0; k<inW; k++) {

inImage[i][k] = inFs.read();

}

}

inFs.close();

int[][] outImage = null;


switch (algo){

case "1" : //반전

// 반전 알고리즘 : out = 255 - in

// (중요!) 출력영상의 크기 결정 --> 알고리즘에 의존

outH = inH;

outW = inW;

// 메모리 할당

outImage = new int[outH][outW];

// 진짜 영상처리 알고리즘

for(int i=0; i<inH; i++)

for (int k=0; k<inW; k++) {

outImage[i][k] = 255 - inImage[i][k];

}

break;

case "2" : //밝게하기

// (3) 알고리즘을 적용하기...

// 반전 알고리즘 : out = 255 - in

// (중요!) 출력영상의 크기 결정 --> 알고리즘에 의존

outH = inH;

outW = inW;

// 메모리 할당

outImage = new int[outH][outW];

// 진짜 영상처리 알고리즘

for(int i=0; i<inH; i++)

for (int k=0; k<inW; k++) {

int value = inImage[i][k] + Integer.parseInt(parameter);

if (value >255)

value=255;

if (value <0)

value=0;


outImage[i][k] = value;


}

break;

case "3" : //어둡게하기

// (3) 알고리즘을 적용하기...

// 반전 알고리즘 : out = 255 - in

// (중요!) 출력영상의 크기 결정 --> 알고리즘에 의존

outH = inH;

outW = inW;

// 메모리 할당

outImage = new int[outH][outW];

// 진짜 영상처리 알고리즘

for(int i=0; i<inH; i++)

for (int k=0; k<inW; k++) {

int value = inImage[i][k] - Integer.parseInt(parameter);

if (value >255)

value=255;

if (value <0)

value=0;


outImage[i][k] = value;


}

break;

case "4" : //흑백

// (3) 알고리즘을 적용하기...

// (중요!) 출력영상의 크기 결정 --> 알고리즘에 의존

outH = inH;

outW = inW;

// 메모리 할당

outImage = new int[outH][outW];

// 진짜 영상처리 알고리즘

for(int i=0; i<inH; i++)

for (int k=0; k<inW; k++) {

if(inImage[i][k]>127)

outImage[i][k]=255;

else

outImage[i][k]=0;


}

break;

case "5" : //확대

// (3) 알고리즘을 적용하기...

// (중요!) 출력영상의 크기 결정 --> 알고리즘에 의존

outH = inH*Integer.parseInt(parameter);

outW = inW*Integer.parseInt(parameter);

// 메모리 할당

outImage = new int[outH][outW];

// 진짜 영상처리 알고리즘

for(int i=0; i<inH*Integer.parseInt(parameter); i++ ){

for(int k=0; k<inW*Integer.parseInt(parameter); k++){

outImage[i][k]=inImage[i/Integer.parseInt(parameter)][k/Integer.parseInt(parameter)];

}

}

break;

case "6" : //축소

// (3) 알고리즘을 적용하기...

// (중요!) 출력영상의 크기 결정 --> 알고리즘에 의존

outH=inH/Integer.parseInt(parameter);

outW=inW/Integer.parseInt(parameter);

// 메모리 할당

outImage = new int[outH][outW];

// 진짜 영상처리 알고리즘

for(int i=0; i<inH/Integer.parseInt(parameter); i++ ){

for(int k=0; k<inW/Integer.parseInt(parameter); k++){

outImage[i][k]=inImage[i*Integer.parseInt(parameter)][k*Integer.parseInt(parameter)];

}

}

break;

case "7" : //회전

// (3) 알고리즘을 적용하기...

// (중요!) 출력영상의 크기 결정 --> 알고리즘에 의존

outH=inH;

outW=inW;

// 메모리 할당

outImage = new int[outH][outW];

// 진짜 영상처리 알고리즘

double radian = Integer.parseInt(parameter)*Math.PI/180.0;

radian = -radian;

int xs, ys, xd ,yd;

int cx=inH/2;

int cy=inW/2;

​

for(int i=0; i<outH; i++) {

for(int k=0; k<outW; k++) {

xs = i;

ys = k;

xd = (int)(Math.cos(radian)*(xs-cx) - Math.sin(radian)*(ys-cy)+cx);

yd = (int)(Math.sin(radian)*(xs-cx) + Math.cos(radian)*(ys-cy)+cy);

if((0 <= xd && xd <outH) && (0 <= yd && yd<outW))

outImage[xs][ys] = inImage[xd][yd];

else

outImage[xs][ys]=255;


}

}

break;

case "8" : //엠보싱

// (3) 알고리즘을 적용하기...

// (중요!) 출력영상의 크기 결정 --> 알고리즘에 의존

outH=inH;

outW=inW;

// 메모리 할당

outImage = new int[outH][outW];

// 진짜 영상처리 알고리즘

double[][] mask = {{-1.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, {0.0, 0.0, 1.0}};

int[][] temp = new int[inH+2][inW+2];


for(int i=0; i<inH+2; i++) {

for(int k=0; k<inW+2; k++) {

temp[i][k] = 127;

}

}

for(int i=0; i<inH; i++) {

for(int k=0; k<inW; k++) {

temp[i+1][k+1] = inImage[i][k];

}

}

for(int i=0; i<outH; i++) {

for(int k=0; k<outW; k++) {

double S = 0.0;

for(int m=0; m<3; m++) {

for(int n=0; n<3; n++) {

S += mask[m][n]*temp[i+m][k+n];

}

}

outImage[i][k] = (int)S + 127;

if(outImage[i][k] > 255) {

outImage[i][k] = 255;

}

if(outImage[i][k] < 0) {

outImage[i][k] = 0;

}

}

}

break;

case "9" : //블러링

outH = inH;

outW = inW;


//메모리 할당

outImage = new int[outH][outW];


//화소영역처리

double mask2[][] = {{1.0/9.0, 1.0/9.0, 1.0/9.0},

{1.0/9.0, 1.0/9.0, 1.0/9.0},

{1.0/9.0, 1.0/9.0, 1.0/9.0}};

//임시 입력 배열 생성

int [][] tempInImage2=new int[inH+2][inW+2];

//임시 입력 배열에 입력 배열 데이터 입력

for(int i=0; i<inH; i++){

for(int k=0; k<inW; k++){

tempInImage2[i][k] = inImage[i][k];

}

}

// 임시 출력 배열 생성

int[][] tempOutImage2=new int[outH][outW];


// 영상처리알고리즘

// 진짜 영상처리 알고리즘

for(int i=0; i<inH; i++){

for(int k=0; k<inW; k++){

double S =0.0;

for(int m=0; m<3; m++){

for( int n=0; n<3; n++){

S += mask2[m][n] * tempInImage2[i+m][k+n];

}

}

tempOutImage2[i][k] = (int)S;

}

}


//마스크 합계 0일때 중간값으로 바꿔주기(너무 어두워서 안보일수 있으니)

for(int i=0; i<outH; i++)

for(int k=0; k<outW; k++)

if(tempOutImage2[i][k]<0)

tempOutImage2[i][k] +=127;

​

//임시출력배열에서 진짜 출력배열로 복사

for(int i=0; i<outH; i++)

for(int k=0; k<outW; k++){

if(tempOutImage2[i][k]>255)

tempOutImage2[i][k]=255;

if(tempOutImage2[i][k]<0)

tempOutImage2[i][k]=0;

outImage[i][k] = tempOutImage2[i][k];

}

break;

}

​

// (4) 결과를 파일로 쓰기

File outFp;

FileOutputStream outFs;

outFp = new File("C:/images/Out/" +outFile+ ".raw");

outFs = new FileOutputStream(outFp.getPath());

​

// 메모리 --> 파일

for (int i=0; i<outH; i++) {

for (int k=0; k<outW; k++) {

outFs.write(outImage[i][k]);

}

}

outFs.close();

out.println("C:/images/Out/" +outFile+ ".raw" + "처리됨");

%>

</body>

</html>

'JSP' 카테고리의 다른 글

서버스크립트 JSP 미니 프로젝트 ver.2  (0) 2021.05.03
서버 스크립트 1일차(2)  (0) 2021.04.27
서버 스크립트 1일차  (0) 2021.04.27