๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ–ฅ๏ธ/Frontend

JavaScript๋กœ ์˜์ƒ์ฒ˜๋ฆฌ ์†Œํ”„ํŠธ์›จ์–ด ๋งŒ๋“ค๊ธฐ (Beta ver.): RAW ์ด๋ฏธ์ง€ ํŒŒ์ผ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ

by HanaV 2023. 4. 12.
728x90

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>
728x90

'๐Ÿ–ฅ๏ธ > Frontend' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

JavaScript๋กœ ์˜์ƒ์ฒ˜๋ฆฌ ์†Œํ”„ํŠธ์›จ์–ด ๋งŒ๋“ค๊ธฐ (Beta ver.): ํ™•๋Œ€ ์‹œ ํ™”์งˆ๊ฐœ์„ ์— ๋Œ€ํ•œ ์ƒ๊ฐ  (0) 2023.04.13
JavaScript๋กœ ์˜์ƒ์ฒ˜๋ฆฌ ์†Œํ”„ํŠธ์›จ์–ด ๋งŒ๋“ค๊ธฐ (Beta ver.): ํžˆ์Šคํ† ๊ทธ๋žจ ์ฒ˜๋ฆฌ, ๊ณฑํ•˜๊ธฐ, ์นดํˆฐํšจ๊ณผ  (0) 2023.04.13
JavaScript๋กœ ์˜์ƒ์ฒ˜๋ฆฌ ์†Œํ”„ํŠธ์›จ์–ด ๋งŒ๋“ค๊ธฐ (Beta ver.): ๋งˆ์Šคํฌ ์‚ฌ์šฉํ•ด์„œ ์— ๋ณด์‹ฑ, ๋ธ”๋Ÿฌ, ๊ฐ€์šฐ์‹œ์•ˆ ๋ธ”๋Ÿฌ, ๋ชจ์…˜๋ธ”๋Ÿฌ, ์ƒคํ”„๋‹, ์—ฃ์ง€  (0) 2023.04.13
JavaScript๋กœ ์˜์ƒ์ฒ˜๋ฆฌ ์†Œํ”„ํŠธ์›จ์–ด ๋งŒ๋“ค๊ธฐ (Beta ver.): RAW ์ด๋ฏธ์ง€ ๋ฐ๊ธฐ์กฐ์ ˆ, ์ƒ‰์ƒ ๋ณ€๊ฒฝ, ๋ฏธ๋Ÿฌ๋ง, ํšŒ์ „, ํ™•๋Œ€/์ถ•์†Œ, ๋ธ”๋Ÿฌํšจ๊ณผ  (0) 2023.04.12
JavaScript๋กœ ์˜์ƒ์ฒ˜๋ฆฌ ์†Œํ”„ํŠธ์›จ์–ด ๋งŒ๋“ค๊ธฐ (Alpha ver.) : ์ด๋ฏธ์ง€ ๋ฐ๊ธฐ์กฐ์ ˆ, ์ƒ‰์ƒ ๋ณ€๊ฒฝ, ๋ฏธ๋Ÿฌ๋ง, ํšŒ์ „, ํ™•๋Œ€/์ถ•์†Œ, ๋‹ค์ด์•„๋ชฌ๋“œ๋กœ ๋งŒ๋“ค๊ธฐ  (0) 2023.04.11

"); wcs_do();