Django CSRF token 에러

Web 2023. 1. 5. 10:59

후후.... 보안 관련 에러인데 찾아보니 내용이 너무 많다.

상당히 복잡하다....

 

CSRF란 #$%&, 원인이 #$%^#, 대안 방법이 블라블라.... 너무 복잡했다.

다른 건 별로 안 궁금하고 내가 원하는 것은 저 에러가 없어지는 것이다.

 

크게 방법은 두가지를 추천했다.

- 예외처리

- html 헤더에 csrf 코드 넣기

 

예외처리는 좀 위험해 보여서 html 헤더에 넣는 방법으로 처리하기로 했다.

 

 

------------------------------------------------------

html 헤더에 csrf 코드 넣기 방법 2가지!

------------------------------------------------------

- html 에 넣기 -

- javascript 에 넣기 -

 

결국 둘 다 form 안에 csrf 코드를 넣어주는 원리는 같고 아래와 같이 한다.

 

1. html 에 넣기

form 안에 {% csrf_token %} 를 넣어주면 됨

 

 

2. javascript 에 넣기

소스)
    var form = document.createElement('form');
    form.setAttribute('method', 'post');
    form.setAttribute('action', '/data/');
    document.charset = "UTF-8";

    var hiddenField = document.createElement('input');
    hiddenField.setAttribute('type', 'hidden');
    hiddenField.setAttribute('name', 'csrfmiddlewaretoken');
    hiddenField.setAttribute('value', '{{csrf_token}}');
    form.appendChild(hiddenField);
 
    document.body.appendChild(form);
    form.submit();

빨강 박스 처럼 넣어주면 끝ㅋ

 

 

아래 참고 글들에서 Django 공식문서를 확인하여

javascript로 csrf를 생성해주는 코드를 만들어서

헤더에 붙여준다고 하는데...

좀 복잡해 보여서 우연히 1번에 html로 붙이는 코드는

사용자에게서 어떻게 보일까 궁금해서 코드를 보았는데

이렇게 input 박스가 생성된 것을 보고 2번과 같이 생성해 주니 잘 됐다ㅋㅋㅋ

코딩 잼네ㅋㅋㅋ

 

 

 

혹시 저 코드가 실행이 안된다면 셋팅이 덜 되어서 그럴 수도 있다.

최신 버전에는 기본으로 셋팅이 되어 있어서 생략했는데 (내 환경도 기본으로 셋팅되어 있었다)

아래 참고 사이트에서 기본 셋팅을 확인하고 가도 괜찮을 것 같다.

 

 

 

 

참고

Forbidden (CSRF token mis.. : 네이버블로그 (naver.com)

히즈웨드 장고(Django) 개발: 폼(Form) 관리와 CSRF 취약점 해결 (tistory.com)

[django] Forbidden (CSRF token missing or incorrect.) 해결하기! by Codong's Development Diary (tistory.com)

 

 

설정

트랙백

댓글

ST-link v2 readout protection (RDP) 설정

Embedded/펌웨어? 2022. 12. 5. 21:14

한번씩 STM칩을 만지는데

그때마다 flash 읽기 방지를 까먹는다ㅋㅋ;

 

 

아래 그림에 Read Out Protection을 설정하면

Flash 읽기를 방지할 수 있다.

Level 0 : 읽기, 쓰기 모두 가능

Level 1 : 쓰기 가능, 읽기 불가능

Level 2 : 모두 불가능

 

Level 2는 돌이킬 수 없기에 매우매우 고심하여 셋팅해야 한다

특별한 경우 아니면 Level 1만 해도 충분하지 않을까 싶다ㅋ

 

 

자료를 찾아보니 저걸 뚫고 해킹하는 것들도 있던데....

다음에 또 기회가 되면 해봐야겠다ㅋ

 

'Embedded > 펌웨어?' 카테고리의 다른 글

USBISP-MK2 Manual  (0) 2020.06.16
C 예제) AES-128 ECB  (1) 2019.06.10
stm32f05xx CRC  (0) 2019.04.16

설정

트랙백

댓글

무료 SSL 인증 사이트. Let's Encrypt

Web 2022. 11. 23. 19:40

이번에 http 서버를 개발하면서

https를 적용시킬 차례이다.

 

SSL 인증은 예전에 리눅스에서 만질때 좀 만져보고

간만에 보게 됐는데, 그때 기억으로 손 쉽게 했으니

별거 없다고 생각했지만.............

 

한국전자인증? 에서 인증서를 받아야 한다.

유료.

그리고 인증서 종류도 여러개 있던데 골치 아프다

 

자료를 찾아보니

책임 소재가 생길만한 정보를 다룰 때나 쓰지

굳이 유료 SSL을 사용하지 않아도 괜찮다고는 한다.

회사에서 쓰는거면 그냥 사서 쓰는 것도 추천하는 글도 있었다.

 

아무튼 무료 SSL 사이트를 찾아보니

Let's Encrypt 라는 곳이 있다

세계적!! 규모의 TLS 공인 인증서라고 한다.

 - Let's Encrypt (letsencrypt.org)

 - Let's Encrypt - 나무위키 (namu.wiki)

 

 

 

그런데 한국전자인증에 돈 주고 한 건 안비밀ㅋㅋㅋㅋㅋㅋ

'Web' 카테고리의 다른 글

Django CSRF token 에러  (0) 2023.01.05
nginX + waitress + django(python) 웹서비스 구축(Windows)  (2) 2022.10.08

설정

트랙백

댓글

python openCV로 외부 IP cam 영상 제어(onvif)

프로그래밍 언어 2022. 11. 16. 15:28

이번에 일정 시간에 한 번씩 외부에 있는 영상을 사진으로 저장해야 하는 일이 생겼다.

 

다른 건 비용이 비싸서 최대한 저렴하게 알아본 결과

IP Cam + LTE모뎀으로 조합했다.

IP Cam은 7만원대, LTE모뎀은 16만원대?였나.. 요금제는 고정IP로 매월 3만원대....

더 싸게 할 수도 있긴하던데... 과제비 꿀꺽ㅋ

(카메라 더 비싼걸 살 걸 그랬다... 발열이 있네?;;)

 

 

 

우선 카메라 설정부터 하여 'ispy'라는 프로그램으로 PC에서 접속 확인을 했다.

아래는 셋팅 및 영상 확인 순서.

ID와 비번, 지금은 로컬 네트워크라 192대역으로 IP 입력함
이렇게 되면 완료

 

 

 

영상은 파이썬, openCV로 제어했다.

 

openCV는 알다시피

> pip install opencv-python

 

코드는 복붙이 정석이지..ㅋㅋㅋㅋ

import cv2
import datetime
import os


def writeVideo():
    #현재시간 가져오기
    currentTime = datetime.datetime.now()
   
    #RTSP를 불러오는 곳
    video_capture = cv2.VideoCapture('rtsp://userID:password12@192.168.100.98:554/stream1')
   
    # 웹캠 설정
    video_capture.set(3, 1280)  # 영상 가로길이 설정
    video_capture.set(4, 720)  # 영상 세로길이 설정
    fps = 12
    # 가로 길이 가져오기
    streaming_window_width = int(video_capture.get(3))
    # 세로 길이 가져오기
    streaming_window_height = int(video_capture.get(4))  
   
    #현재 시간을 '년도 달 일 시간 분 초'로 가져와서 문자열로 생성
    fileName = str(currentTime.strftime('%Y %m %d %H %M %S'))

    #파일 저장하기 위한 변수 선언
    path = f'C:\\Users\\USER\\Desktop\\Projects\\05 Sewage Level Meter\\SourceCode\\python\\Cam\\sourceCode\\{fileName}.avi'
   
    # DIVX 코덱 적용 # 코덱 종류 # DIVX, XVID, MJPG, X264, WMV1, WMV2
    # 무료 라이선스의 이점이 있는 XVID를 사용
    fourcc = cv2.VideoWriter_fourcc('X', 'V', 'I', 'D')
   
    # 비디오 저장
    # cv2.VideoWriter(저장 위치, 코덱, 프레임, (가로, 세로))
    out = cv2.VideoWriter(path, fourcc, fps, (streaming_window_width, streaming_window_height))

    while True:
        ret, frame = video_capture.read()
        # 촬영되는 영상보여준다. 프로그램 상태바 이름은 'streaming video' 로 뜬다.
        cv2.imshow('streaming video', frame)
       
        # 영상을 저장한다.
        out.write(frame)
       
        # 1ms뒤에 뒤에 코드 실행해준다.
        k = cv2.waitKey(1) & 0xff
        #키보드 esc 누르면 종료된다.
        if k == 27:
            cv2.imwrite(f'C:\\Users\\USER\\Desktop\\Projects\\05 Sewage Level Meter\\SourceCode\\python\\Cam\\sourceCode\\shot.png', frame)
            break
    video_capture.release()  # cap 객체 해제
    out.release()  # out 객체 해제
    cv2.destroyAllWindows()

if __name__ == "__main__":
    writeVideo()

 

https://pcseob.tistory.com/25 (소스 참고. 감사합니다ㅋㅋ)

 

 

소스에서

video_capture = cv2.VideoCapture('rtsp://userID:password123@192.168.100.98:554/stream1')

이 부분의 주소를 ispy 사진 밑에서 두번째 란에 ID와 주소를 넣으면 된다.

 

 

실행 결과>

 

 

esc 키 누르면 끝나는 지점에 마지막 Frame을 png 파일로 저장했다.

일정 시간마다 접속해서 저장만 하면 끝ㅋ

 

설정

트랙백

댓글

nginX + waitress + django(python) 웹서비스 구축(Windows)

Web 2022. 10. 8. 11:14

python으로 짠 웹서비스를 구축하려고 한다.

Linux 환경에서 하는게 맞지만 편의상 윈도우에서 구축해 보려고 한다.

윈도우 환경 추천은 안한다;;

linux에서 자료는 많지만 윈도우는 잘 없었다... 없는 이유가... 추천 안한다ㅋㅋ

 

자료를 찾아보신 분들은 아실거지만 django로 바로 웹서비스를 구축하지 말라고

django 팀에서도 정식으로 말하고 있다. 자세한 것은 아래 정리를 너무 잘해주신 분꺼 링크가 있다.

https://uiandwe.tistory.com/1268

 

wsgi 종류 중에 윈도우에서 설치가 안되거나 까다로운게 많아서

손쉽게 할 수 있는 것을 찾아보니 waitress였다.

 

아래 내용은 nginX, waitress, django 설치 및 셋팅, 테스트 실행 까지이다.

 

 

--- nginX 설치

http://nginx.org/en/download.html

난 아직 잘 몰라서 Stable version을 받았다.

원하는 폴더에 압축을 풀고 실행 파일을 실행하면

아무 반응이 없을 것이다ㅋㅋ

웹을 키고 http://127.0.0.1 or http://localhost 를 치고 들어가 보자

아래 같이 뜨면 다음으로 ㄱㄱ

 

 

--- django, waitress 설치

다른 것과 환경이 엉키는 것을 방지해서 가상 환경을 구성하여 설치한다.

'cmd'를 켜고 작업 위치에 간다.

test 폴더에 가상 환경을 구축하고 실행했다.

> python -m venv test (가상환경 구성 명령어)
> cd test (test 폴더로 이동)
> cd Scripts (Scripts 폴더로 이동)
> .\activate (가상환경 실행)

 

여기까지 하면 아래와 같이 바뀐다.

 

이제 django, waitress 를 설치는 아주 쉽다.

에러만 안나면....

에러는.... 다른 곳을 참고하시길ㅜㅜ;

> pip install django

> pip install waitress

 

 

--- 셋팅

이제 셋팅을 하자. 이것도 아주 쉽다. 아래와 같이 진행할 것이다.

    1. django 프로젝트 생성 및 실행

    2. nginX 셋팅 후, 실행

 

1. django 프로젝트 생성

> mkdir Projects (Projects 폴더 생성)
> cd Projects (Projects 폴더로 이동)
> django-admin startproject firstSite (firstSite 라는 장로 프로젝트 생성)

 

한번 테스트를 django로 실행해 보면 아래와 같이 뜬다.

http://127.0.0.1:8000/ or http://localhost:8000/ 둘 중에 접속되면 굿

다음 실행을 위해 cmd창에 'Ctrl + C'를 눌러서 프로그램을 종료한다

 

 

이제 nginX와 연결해 줄 waitress로 실행.

waitress-serve --listen=*:8000 firstSite.wsgi:application (waitress로 실행)

--listen=(ip):(port) 이다.

--listen=*:8000 이면 모든 ip로 8000번 포트를 연다는 뜻이다.

 

firstSite.wsgi:application 은 firstSite 모듈? 안에 wsgi 안에 application을 실행인 것 같다.

dir로 폴더 리스트와 현재 위치가 보이듯 manage.py와 firstSite 폴더가 보이는 곳에서 실행해야 한다.

 

그리고 다시 http://127.0.0.1:8000/ or http://localhost:8000/ 둘 중에 접속되면 끝

 

 

2. nginX 셋팅 후, 실행

nginX 압축 푼 곳에 가서 conf 폴더에 들어가면

nginX.conf라는 파일이 있다.

메모장 같은 것으로 열고 아래와 같이 타이핑 해준다.

location / {
            proxy_pass  http://localhost:8000;
        }

 

위에 내용을 넣기 전에 반드시 빨강 박스 처럼 #를 붙여 주석 처리를 해준다.

그리고 다시 nginX를 실행시켜주면 끝ㅋ

혹시 전에 nginX를 종료한 적이 없으면

작업관리자 or cmd 창에서 해당 위치에서 'nginX -s stop' 명령을 줘서 종료 후 실행하길 바란다.

 

http://localhost or http://127.0.0.1로 접속해서 아래와 같이 뜨면 끝ㅋ

 

이제 python으로 마음껏 개발해 봅시다ㅋㅋㅋ

'Web' 카테고리의 다른 글

Django CSRF token 에러  (0) 2023.01.05
무료 SSL 인증 사이트. Let's Encrypt  (0) 2022.11.23

설정

트랙백

댓글

PLC 기초 1

PLC/LS Electic 2022. 2. 7. 15:49

--- PLC (Programable Logic Controller) : 프로그램 로직 제어기

 

--- 주요 브랜드

    LS Eletric(LS산전), 지멘스, 미쯔비시, AB, 파나소닉, 케인스, OMRON 등 많음

    우리나라에서는 미쯔비시, 지멘스, LS Electric 많이 사용한다고 함

    화자는 LS Electric을 사용함 (I love 국산)

 

--- LS Electric PLC 종류

    크게 규모와 프로그램 방식에 따라 나뉨

    먼저 규모로 XGT(복잡, 대형)와 XGB(간단, 소형)로 나뉨

 

    그 안에서 프로그램 방식에 따라

    국제표준 방식, 명령어? 방식으로 나뉨

 

    그 외로 구형(Glofa, Master-K)도 있지만 단종되었으니 언급하지 않겠으나

    아직 인기가 있어 대리점에서는 판매 중이라고 함

 

    아무래도 국제표준 방식을 익히면 다른 브랜드의 제품도 손 쉽게 할 수 있음

    But 화자는 명령어? 방식으로 하겠음 (I love 국산)

 

 

--- 프로그램 툴

    XG5000 : PLC 작성 프로그램

    XP-Builder : HMI 작화 툴 (화면 만들기~)

 

    LS ELECTRIC (ls-electric.com)

    요기 가서 검색하면 나옴. 다운 & 설치 ㄱㄱ

 

설정

트랙백

댓글

Python 셀레니움 이미지 크롤링

프로그래밍 언어 2020. 11. 2. 15:35

www.youtube.com/watch?v=1b7pXC1-IbE

 

와우~

설정

트랙백

댓글

HTTP 3핸드 쉐이킹 캡쳐

통신/TCP_IP 2020. 10. 12. 10:00

스트림 데이터를 받는데,

3핸드쉐이킹 후에 데이터를 주고 받는 것을 캡쳐해 봤다.

HTTP REST API의 GET으로 보낼 때, HEX 값 같은 것이 아닌 문자열을 주고 받는 것을 확인하였다.

위에

'빨강 {' 이 3핸드 쉐이킹이고

'빨강 -' 가 REST API의 GET, 밑에 빨강 박스가 그 내용이다.

 

 

 

 

 

 

 

'통신 > TCP_IP' 카테고리의 다른 글

Ethernet, IP, TCP, UDP Frame  (0) 2014.10.15
TCP/IP 4 계층  (0) 2014.10.15

설정

트랙백

댓글

C# RGB 출력, YUV420 -> RGB로 출력

프로그래밍 언어/C# 2020. 9. 1. 16:17

Raspberry Pi Zero W에 카메라 이미지를 PC에 전송하여 출력하는 것을 작업하고 있다.

 

그런데.... Raspberry Pi 에서 큰 문제가 생겼다...

 

자료를 찾아보니 대부분 OpenCV를 사용하여 데이터를 보내길래

 

OpenCV를 깔아봤는데.... 'Illegal instruction'이라고 에러가 떠서 동작이 안된다.

 

아무리 삽질을 해봐도 해결 방법을 못 찾았다ㅠㅠ;;

 

 

그래서 다른 방법을 찾던 중, 라즈베리 기본 설치 프로그램 중에

 

raspistill, raspivid, raspiyuv, raspividyuv를 사용해서 데이터를 보낼 방법을 찾았다.

 

 

 

라즈베리에서 카메라 실행은

raspividyuv -w 480 -h 320 -fps 5 -t 0 -l -o tcp://192.168.0.125:7777

이 명령 사용

 

YUV420 포멧으로 raw 데이터 보냄.

 

그래서 C#에서 화면에 그려줄때

480x320 사이즈로

한 프레임당 230400 bytes 이다.

 

0~153600 까지는 Y 값

153600~192000 까지는 U 값

192000~230400 까지 V 값

으로 구성되어 있다.

 

소스 ProcDrawingBuf() 함수에 38400 은 V값과 U 값 크기이다.

 

곳곳에 마이크 녹음이랑 사운드 출력도 있다....

 

 

--- MainWindow.xaml.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Resources; // test.jpg
using System.IO.Ports; // SerialPort
using System.Windows.Threading; // DispatcherPriority
using System.Threading; // Thread
using NAudio.Wave;
using System.Drawing; // Bitmap
using System.IO;
using System.Net.Sockets; // TcpClient
using System.Net;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;

namespace YUVRGB_Ctrl
{
    ///
    /// MainWindow.xaml에 대한 상호 작용 논리
    /// 
    public partial class MainWindow : System.Windows.Window
    {
        private SerialPort sp;  // COM 포트
        private bool portOpen;  // 포트 열림 여부

        private WaveIn sourceStream = null; // 녹음 핸들?

        private Thread t1; // 네트워크 스트림 thread
        private Thread t2; // 비트맵 thread
        private string destIP; // 원격지 IP
        private bool ipOpen; // 원격지 열기 닫기 여부

        private TcpClient tc; // 원격지 주소
        private NetworkStream stream; // 원격지 스트림

        private byte[] streamBuf = new byte[230400];
        private byte[] drawingBuf = new byte[230400];

        public MainWindow()
        {
            InitializeComponent();

            sp = null;
            portOpen = false;
            t1 = null;
            ipOpen = false;

            // 임시 이미지 그리기
            //BitmapImage drawImg = new BitmapImage(new Uri(@"C:\Users\root\Documents\Visual Studio 2017\Projects\KLabs RGControl\KLabs RGControl\test.jpg"));
            BitmapImage drawImg = new BitmapImage(new Uri("test.jpg", UriKind.Relative));
            imgTest.Source = drawImg;
            imgTest.Visibility = Visibility.Hidden;

            // 키보드 처리 인터럽트 추가
            this.KeyDown += new KeyEventHandler(FuncKeyDown);
        }

        // 키보드 처리
        private void FuncKeyDown(object sender, KeyEventArgs e)
        {
            switch(e.Key)
            {
                case Key.Escape:
                    this.Close();
                    break;
            }
        }

        // 메인 윈도우창 이동
        private void Window_MouseLeftBtnDown(object sender, RoutedEventArgs e)
        {
            Cursor = Cursors.SizeAll;
            this.DragMove();
        }

        private void Window_MouseLeftBtnUp(object sender, RoutedEventArgs e)
        {
            Cursor = Cursors.Arrow;
        }

        // exit 버튼
        private void BtnExit_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }

        // connect 버튼
        private void BtnConnect_Click(object sender, RoutedEventArgs e)
        {
            // 연결되어 있으면 기존 연결 끊기
            if (ipOpen == true)
            {
                // 스트림과 TcpClient 객체 닫기
                stream.Close();
                tc.Close();
                ipOpen = false;
            }

            Window1 infoWindown = new Window1();
            infoWindown.OnChildDataEvent += new Window1.OnChildDataHandler(GetDataFromChild);
            infoWindown.ShowDialog();
        }

        // 카메라, 센서 연결.
        private void GetDataFromChild(string destIP, string comPort)
        {
            // COM 포트 열기
            //OpenComport(comPort);

            // IP 카메라 연결
            OpenCam(destIP);
        }

        // COM 포트 열기
        private void OpenComport(string destCom)
        {
            Console.WriteLine(destCom);
            // COM 연결 상태 확인
            if(sp == null)
            {
                try
                {
                    // 1. SerialPort 클래스 객체 생성
                    sp = new SerialPort();

                    // 2. SerialPort 포트 셋팅 설정
                    sp.PortName = destCom;
                    sp.BaudRate = (int)115200;
                    sp.DataBits = 8;
                    sp.Parity = Parity.None;
                    sp.StopBits = StopBits.One;
                    sp.Handshake = Handshake.None;
                    sp.DataReceived += new SerialDataReceivedEventHandler(SerialPort_DataReceived);

                    // 3. 시리얼포트 오픈
                    sp.Open();
                    portOpen = true;
                }
                catch
                {
                    MessageBox.Show("COM 포트 열기 에러");
                }
            }
        }

        // COM 포트에서 읽은 데이터 처리
        public void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            if ((portOpen == true) && (sp.BytesToRead >= 0))
            {
                try
                {
                    var stBulider = new StringBuilder();
                    stBulider.Append(sp.ReadLine());
                    //buf = sp.ReadLine();
                    if (stBulider[0] == '0')
                    {
                        stBulider.Append(sp.ReadLine());
                        stBulider.Append(sp.ReadLine());
                        stBulider.Append(sp.ReadLine());
                        stBulider.Append(sp.ReadLine());
                        /*
                        buf += sp.ReadLine();
                        buf += sp.ReadLine();
                        buf += sp.ReadLine();
                        buf += sp.ReadLine();
                        */
                        //buf = buf.Replace("\r", " ");

                        Dispatcher.Invoke(DispatcherPriority.Normal, new Action(delegate
                        {
                            labelSensorStatus.Content = stBulider.ToString();
                        }));
                        //this.labelSerial.Content = buf;
                    }
                }
                catch
                { }
            }
        }

        // IP 카메라 연결
        private void OpenCam(string destIP2)
        {
            destIP = destIP2;
            Console.WriteLine(destIP2);
            imgTest.Visibility = Visibility.Visible;
            labelNetworkStatus.Visibility = Visibility.Hidden;

            // 카메라 데이터 스레드 처리
            /*
            if(t1 == null)
            {
                t1.Abort();
            }
            */
            int aTmp;

            t1 = new Thread(new ThreadStart(ProcCamData));
            t1.Start();
        }

        // IP 카메라 데이터 처리
        private void ProcCamData()
        {
            byte[] outbuf = new byte[15000];
            int nbytes;
            int total;
            int i, f;
            string output;
            string sTime = System.DateTime.Now.ToString("mm:ss.ffffff");
            TcpClient tc = new TcpClient("192.168.0.125", 7777);
            NetworkStream stream = tc.GetStream();

            total = 0;
            i = 0;
            f = 0;
            while(true)
            {
                nbytes = stream.Read(outbuf, 0, outbuf.Length);
                // 한 프레임(230400) 처리
                if (total + nbytes >= 230400)
                {
                    Array.Copy(outbuf, 0, streamBuf, total, 230400 - total);
                    Array.Copy(streamBuf, drawingBuf, 230400);
                    Array.Copy(outbuf, 230400 - total, streamBuf, 0, nbytes - (230400 - total));
                    if(t2 == null)
                    {
                        t2 = new Thread(new ThreadStart(ProcDrawingBuf));
                        t2.Start();
                    }
                    else if ((t2.ThreadState & ThreadState.Stopped) == ThreadState.Stopped)
                    {
                        t2 = new Thread(new ThreadStart(ProcDrawingBuf));
                        t2.Start();
                    }
                    total = nbytes - (230400 - total);
                    f++;
                }
                else
                {
                    Array.Copy(outbuf, 0, streamBuf, total, nbytes);
                    total += nbytes;
                }
                i++;
                //output = Encoding.ASCII.GetString(outbuf, 0, nbytes);
                //Console.WriteLine($"{i} : {nbytes} ");// bytes: {output}");

                if (nbytes == 0)
                {
                    break;
                }
            }
            Console.WriteLine($"total : {i} {f}");
            Console.WriteLine($"Start time : {sTime}");
            Console.WriteLine($"End time : {System.DateTime.Now.ToString("mm:ss.ffffff")}");

            stream.Close();
            tc.Close();
        }

        private void ProcDrawingBuf()
        {
            Bitmap bitmap = new Bitmap(480, 320);
            BitmapData bmpData = bitmap.LockBits(new System.Drawing.Rectangle(0, 0, 480, 320), ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
            int k, uv;
            int bY, bU, bV;

            k = 0;
            uv = 0;
            unsafe
            {
                byte* ptr = (byte*)bmpData.Scan0.ToPointer();
                for (int i = 0; i < 320; i++)
                {
                    for (int j = 0; j < 480; j++)
                    {
                        if (uv >= 38400)
                        {
                            break;
                        }
                        bU = drawingBuf[320 * 480 + uv] - 128;
                        bV = drawingBuf[320 * 480 + 38400 + uv] - 128;
                        bY = drawingBuf[k];

                        // R
                        if (bV < 0)
                            ptr[bmpData.Stride * i + 3 * j + 2] = (byte)bY;
                        else
                            ptr[bmpData.Stride * i + 3 * j + 2] = (byte)(bY + (2.0790 * bV));

                        // G
                        if (bU < 0)
                            ptr[bmpData.Stride * i + 3 * j + 0] = (byte)bY;
                        else
                            ptr[bmpData.Stride * i + 3 * j + 0] = (byte)(bY + (1.4075 * bU));

                        // B
                        ptr[bmpData.Stride * i + 3 * j + 1] = (byte)(bY - (0.237633 * bV) - (0.337633 * bU));

                        k++;
                        if (j % 2 == 0)
                        {
                            uv++;
                        }
                    }
                    if (i % 2 == 0)
                    {
                        uv -= 240;
                    }
                }
                bitmap.UnlockBits(bmpData);
            }

            Dispatcher.Invoke(DispatcherPriority.Normal, new Action(delegate
            {
                imgTest.Source = BitmapToImageSource(bitmap);
            }));
            bitmap.Dispose();
        }

        public Bitmap ScreenCapture()
        {
            // 주화면의 크기 정보 읽기
            int width = (int)SystemParameters.PrimaryScreenWidth;
            int height = (int)SystemParameters.PrimaryScreenHeight;
            Bitmap scrbmp = new Bitmap(width, height);

            using (Graphics g = Graphics.FromImage(scrbmp))
            {
                g.CopyFromScreen(0, 0, 0, 0, scrbmp.Size, CopyPixelOperation.SourceCopy);
            }

            // Image에 캡처한 이미지를 뿌려주기 위해 Bitmap을 BitmapImage로 변환한다.
            using (MemoryStream memory = new MemoryStream())
            {
                scrbmp.Save(memory, ImageFormat.Bmp);
                memory.Position = 0;
                BitmapImage bitmapimage = new BitmapImage();
                bitmapimage.BeginInit();
                bitmapimage.StreamSource = memory;
                bitmapimage.CacheOption = BitmapCacheOption.OnLoad;
                bitmapimage.EndInit();
                imgTest.Source = bitmapimage;
            }

            return scrbmp;
        }

        BitmapImage BitmapToImageSource(Bitmap bitmap)
        {
            using (MemoryStream memory = new MemoryStream())
            {
                bitmap.Save(memory, System.Drawing.Imaging.ImageFormat.Bmp);
                memory.Position = 0;
                BitmapImage bitmapimage = new BitmapImage();
                bitmapimage.BeginInit();
                bitmapimage.StreamSource = memory;
                bitmapimage.CacheOption = BitmapCacheOption.OnLoad;
                bitmapimage.EndInit();

                return bitmapimage;
            }
        }

        // 마이크 녹음 초기화
        public void RecodeMic()
        {
            sourceStream = new NAudio.Wave.WaveIn();
            sourceStream.BufferMilliseconds = 50;
            sourceStream.DeviceNumber = 0;
            sourceStream.WaveFormat = new NAudio.Wave.WaveFormat(4800, NAudio.Wave.WaveIn.GetCapabilities(0).Channels);
            sourceStream.DataAvailable += new EventHandler(sourceStream_DataAvailable);
            sourceStream.StartRecording();
        }

        // 마이크 녹음 데이터 처리
        private void sourceStream_DataAvailable(object sender, NAudio.Wave.WaveInEventArgs e)
        {
            byte[] encoded = e.Buffer;
            int i;
            float multiplier = 12.0f;   // Gain

            for (i = 0; i < encoded.Length; i = i + 2)
            {
                Int16 sample = BitConverter.ToInt16(encoded, i);
                sample = (Int16)(sample * multiplier);
                byte[] sampleBytes = BitConverter.GetBytes(sample);
                encoded[i] = sampleBytes[0];
                encoded[i + 1] = sampleBytes[1];
            }

            //encoded.CopyTo(recordingStream2, encoded.Length);
        }
    }
}

 

 

--- 실행화면

   - Raspberry pi zero w

 

   - PC

 

'프로그래밍 언어 > C#' 카테고리의 다른 글

C# 이미지 그리기, 출력  (0) 2020.08.21
C# NAudio MicroPhone 볼륨 조절  (0) 2020.08.20

설정

트랙백

댓글

C# 이미지 그리기, 출력

프로그래밍 언어/C# 2020. 8. 21. 14:16

그림을 출력할때, 다음과 같은 방법이 있다.

 

- 절대 경로

imgTest.Source = new BitmapImage(new Uri(@"C:\Image\test.png", UriKind.Absolute));

 

- 상대 경로

imgTest.Source = new BitmapImage(new Uri(@"\test.png", UriKind.Relative));

 

- 상대 경로(리소스)

imgTest.Source = new BitmapImage(new Uri(@"\test.png", UriKind.Relative));

 

imgTest는 이미지 도구상자 이름이다.

BitmapImage 2번째 인자는

https://docs.microsoft.com/ko-kr/dotnet/api/system.urikind?view=netcore-3.1

 

 

- 이렇게 저장해서 필요할 때 쓰기도...

BitmapImage bitTmp = new BitmapImage(new Uri(@"\Image\1.png", UriKind.Relative));

imgTeset.Source = bitTmp;

 

 

- 리소스 방식을 쓸때는 리소스에 추가해서 써야한다.

 

    리소스 관리 페이지로 들어가서

 

    리소스를 추가하고

 

    추가된 파일의 속성을 바꾸면 끝.

 

'프로그래밍 언어 > C#' 카테고리의 다른 글

C# RGB 출력, YUV420 -> RGB로 출력  (0) 2020.09.01
C# NAudio MicroPhone 볼륨 조절  (0) 2020.08.20

설정

트랙백

댓글