Alpha ๋ฒ์ ์์๋ ๋์๋ก ํ๋ค๋ฉด, ์ด๋ฒ์๋ ํ ๋จ๊ณ๋ฅผ ์
ํด์ ์ง์ง ์ด๋ฏธ์ง์ ์์์ฒ๋ฆฌ ์๊ณ ๋ฆฌ์ฆ์ ์ ์ฉํด๋ณด๊ณ ์ ํ๋ค.
์ผ๋ฐ ํ์ผ(BMP, JPG, PNG, TIF, GIF ๋ฑ)์ ์ด๋ฏธ์ง์ฒ๋ฆฌํ๊ธฐ ๋ง์ด ์ด๋ ค์ด๋ฐ, RAW ์ด๋ฏธ์ง ํ์ผ์ 1byte๊ฐ 1๊ฐ์ ํฝ์
์ ์๋ฏธํ๊ธฐ ๋๋ฌธ์ ๋น๊ต์ ์ฝ๊ฒ ๊ฐ๋ฅํ์ง๋ง, ํ๊ณผ ์ด์ด ๊ฐ์์ผ ํ๋ค๋ ์ ํ์ด ์๋ค.Alpha๋ฒ์ ๊ณผ ์๊ณ ๋ฆฌ์ฆ์ ๊ฐ์๋ ์ด๋ฒ์ ๋์๊ฐ ์๋ ์ด๋ฏธ์ง ํ์ผ์ ๋ถ๋ฌ์์ผํ๊ธฐ ๋๋ฌธ์, ๊ธฐ๋ณธ ์์
์ ๋จผ์ ์ธํ
ํด์ผ ํ๋ค.
1. ํ์ผ์ ์ ํํด์ ๋ถ๋ฌ์ฌ ์ ์๊ฒ ํ์ผ์ ์ฝ์ด์ค๋ ๋ฒํผ์ ๋ง๋ ๋ค.
2. ์บ๋ฒ์ค ๋ง๋ค๊ณ ๊ธฐ๋ณธ๊ฐ ์ค์ ํ๋ค.
3. ์บ๋ฒ์ค ๊ธฐ๋ณธ ํด(๋ํ์ง ๋ฌผ๊ฐ ์ค๋น)์ ํจ์๋ก ๋ง๋ค์ด์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์คํ๋๋๋ก ํ์
4. raw ์ด๋ฏธ์ง ํ์ผ์ ์ด๋ฉด ์บ๋ฒ์ค์ ๋ํ๋๋๋ก ํด์ผํ๋ฏ๋ก onchange๋ฅผ ์ถ๊ฐํด ์ฃผ์
5. openRawImage ์ค์ ํ๊ธฐ
5-1. ์ฐ์ ์ด๋ฏธ์ง๋ฅผ ๋ถ๋ฌ์ฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ๋ณดํด์ฃผ๊ณ , ์ด๋ฏธ์ง์ ๋์ด์ ํญ์ ๊ธฐ์ค์ผ๋ก ์บ๋ฒ์ค์ ๋์ด์ ํญ์ ์ฌ์ค์ ํ๋ค.
5-2. ๊ทผ๋ฐ ์ฐ์ ์ด๋ฏธ์ง ํ์ผ์ ๋ฐ์ ๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ ์ฒ๋ฆฌํ๊ณ , ์ด๋ฏธ์ง์ ๋์ด์ ํญ๋ ๊ณ์ฐํด์ผ ํ๋ฏ๋ก ์์ ์ถ๊ฐํด ์ค๋ค.
5-3. ์ด์ ๋ถ๋ฌ์จ raw์ด๋ฏธ์ง ํ์ผ์ ํ๋ณดํด ๋ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ฉ์ ํด์ผ ํ๋ค. ์ผ๋จ ํ์ผ์ ๋ฐ์ด๋๋ฆฌ ํ์ผ๋ก ์ฝ์ด๋ด์ผ ํ๋ฏ๋ก ๋ณํ์์ผ ์ค๋ค.
5-4. ํ์ผ์ ๋ถ๋ฌ์ค๋ ๊ฒ์ ํ์ผ์ ํด๋ฆญํ ๋ ํ ๋ฒ์ด๋ฉด ๋๋ฏ๋ก ์ต๋ช
ํจ์๋ก ๋ถ๋ฌ์ค๊ธฐ๋ก ํ์.
5-5. ํ์ผ์ํ์์ ๋ฐ๋ก ๋ฉ๋ชจ๋ฆฌ๋ก ๋ถ๋ฌ์ค๊ธฐ๋ณด๋ค๋, ๋ฐ์ด๋๋ฆฌ ์ฒ๋ฆฌํ ํ์ผ์ ์์๋ก ๋ค๋ฅธ ๊ณณ(blob)์ ๋๊ณ , ๊ฑฐ๊ธฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ฝ์์ ๋ฉ๋ชจ๋ฆฌ์ ๋ถ๋ฌ์ค๊ธฐ๋ก ํ๋ค.
5-6. ์ด์ blob์์ ํ๋์ฉ ๋ฝ์์ inH x inW ๋ฐฐ์ด์ ์ฐจ๋ก๋ก ๋ฃ์ผ๋ฉด ๋๋ค.
5-7. ์ด๋, ํ ํฝ์ ์ฉ ์๋ฅด๊ธฐ ์ํด start pixel๊ณผ end pixel์ ์ ํด ๋ฑ 1์ฉ๋ง ์๋ผ์ฌ ์ ์๋๋ก ํ๋ค. (์ค๋ช ์ด๋ฏธ์ง ๊ทธ๋ ค์ ์ถ๊ฐ)
5-8. ์ด์ ์ ์ฅํ ์ด๋ฏธ์ง๋ฅผ ์บ๋ฒ์ค๋ก ๋ถ๋ฌ์ค๋ฉด ๋๋๋ฐ, ์์ฝ๊ฒ๋ ์บ๋ฒ์ค๋ ์ ์ ๋ํ๋ผ ์ ์๋ค. ๊ทธ๋ฌ๋ฏ๋ก ์์๋ก ์ข ์ด(inPaper)๋ฅผ ๋ง๋ค์ด์ ๊ฑฐ๊ธฐ๋ค๊ฐ ์ด๋ฏธ์ง๋ฅผ ๋ถ์ธ ๋ค, ์ข ์ด๋ฅผ ์บ๋ฒ์ค์ ๋ถ์ด๋๋ก ํ์.
5-9. ์ด์ ์ข ์ด์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋ ์ด๋ฏธ์ง๋ฅผ ๋ถ์ด๋ ์์ ์ ํด์ผ ํ๋ค.
์ด๋, ํ๋์ ํฝ์ ์
5-10. ์ด๋ฏธ์ง๋ฅผ ์ข ์ด์ ๋ถ์์ผ๋ฉด ์ด์ ์ข ์ด๋ฅผ ์บ๋ฒ์ค์ ๋ถ์ด๋ฉด ๋๋ค. ์ฌ์ด์ฆ๋ ๋์ด ๋๊ฐ์ด ์ค์ ํด ๋จ์ผ๋ฏ๋ก ์ข ์ด๊ฐ (0,0)๋ถํฐ ์์นํ๋๋ก ํ๋ค.
512 raw ์ด๋ฏธ์ง๋ฅผ ๋ถ๋ฌ์์ ๋
256์ ๋ถ๋ฌ์์ ๋
์ ์ฒด ์ฝ๋
<!DOCTYPE html>
<HTML>
<HEAD>
<script lang="javascript">
//์ ์ญ ๋ณ์ ์ ์ธ
var inCanvas, inCtx, inFile;
var inImage, inH, inW;
var inPaper;
function init() {
inCanvas = document.getElementById("inCanvas"); //๋ํ์ง
inCtx = inCanvas.getContext('2d'); //๋ฌผ๊ฐํต
}
function openRawImage(){
inFile = document.getElementById("inFile").files[0];
inH = inW = Math.floor(Math.sqrt(inFile.size));
inImage = new Array(inH);
for (var i=0; i<inH; i++) {
inImage[i] = new Array(inW);
}
inCanvas.height = inH;
inCanvas.width = inW;
//Loading . . .
var reader = new FileReader();
reader.readAsBinaryString(inFile);
reader.onload = function() {
var blob = reader.result;
for (var i=0; i<inH; i++) {
for (var k=0; k<inW; k++) {
var startPixel = (i*inH + k);
var endPixel = (i*inH + k)+1;
inImage[i][k] = blob.slice(startPixel, endPixel).charCodeAt(0);
}
}
inPaper = inCtx.createImageData(inH, inW);
for (var i=0; i<inH; i++) {
for (var k=0; k<inW; k++) {
var pixel = inImage[i][k];
inPaper.data[(i*inH+k)*4 + 0] = pixel; //R
inPaper.data[(i*inH+k)*4 + 1] = pixel; //G
inPaper.data[(i*inH+k)*4 + 2] = pixel; //B
inPaper.data[(i*inH+k)*4 + 3] = 255; //Alpha
}
}
inCtx.putImageData(inPaper,0,0);
}
}
</script>
</HEAD>
<BODY onload="init()">
<input type="file" id="inFile" onchange="openRawImage()" />
<canvas id="inCanvas" height="512" width="512" style="background-color: pink;"></canvas>
</BODY>
</HTML>