728x90
300x250
[C#](OpenCVSharp 4) - Face Detection(얼굴 인식)

 

Face Detection(얼굴 인식)을 C# GUI환경에서 구현하는 방법에 대해 소개하려고 합니다.

OpenCV 공식 github사이트에서 라이브러리를 내려받은 후 진행할 것입니다.

(Let me introduce how to implement Face Detection in C# GUI environment.We will proceed after downloading the library from the official OpenCV github site.)

 

 


1. OpenCV 프로젝트 내려받기

 

http://github.com/opencv/opencv

http://github.com/opencv/opencv/data

 

 

 

 

이 파일이 얼굴 인식에 사용되는 중요한 라이브러리입니다.

(This file is an important library for face recognition.)

얼굴 인식 기능을 사용하려면, 프로젝트에 포함시켜야 합니다.
(To use face detection, you must include it in your project.)

 

[첨부(Attachment)]

haarcascade_frontalface_alt.7z

 

 


2. Nuget으로 OpenCVSharp 4 설치하기(Installing OpenCVSharp 4 with Nuget)

 

프로젝트->Nuget 패키지 관리를 클릭합니다.

"OpenCvSharp4"를 검색하여 설치하도록 합니다.
(Click Project-> Nuget Package Management.Search for "OpenCvSharp4" and install it.)

 

 

 


3. 사용자 인터페이스 구성(Configure the User Interface)


OpenCvSharp.UserInterface 내에 있는 PictureBoxlpl 하나, Timer 하나를 배치합니다.

 

Form1은 Load 코드를 활성화합니다.

Timer1은 Enabled = true로 해주고, Interval은 33으로 해줍니다.

Timer1의 Tick를 활성화해줍니다.

(Form1 activates the Load code.)

(Timer1 sets Enabled = true and Interval sets 33.)

(Activate Tick of Timer1.)

 


4. 프로젝트 내에 중요한 설정하기(Make important settings within your project)

 

세 가지 사항을 별표로 하였습니다.(Three points are starred.)

 

 

 

 

 

 

 

haarcascade_frontalface_alt.xml, opencvSharpExtern.dll은 출력 디렉터리에 복사 항목을 "새 버전이면 복사"에 체크해줍니다.

OpenCVSharpExtern.dll은 아래의 사이트에서 내려받을 수 있습니다.
(haarcascade_frontalface_alt.xml, opencvSharpExtern.dll checks "Copy if newer version" to the output directory.

OpenCVSharpExtern.dll can be downloaded from the site below.)

 

https://github.com/shimat/opencvsharp/releases

 

 

 


5. 코드 작성

 

코드를 작성해봅니다.

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using OpenCvSharp;

namespace CsharpFaceDetection
{
    public partial class Form1 : Form
    {

        VideoCapture video;
        Mat frame = new Mat();

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

            try
            {
                video = new VideoCapture(0);
                video.FrameWidth = 640;
                video.FrameHeight = 480;
            }
            catch
            {
                timer1.Enabled = false;
            }

        }

        private void timer1_Tick(object sender, EventArgs e)
        {

            int sleepTime = (int)Math.Round(1000 / video.Fps);

            String filenameFaceCascade = "haarcascade_frontalface_alt.xml";
            CascadeClassifier faceCascade = new CascadeClassifier();

            if (!faceCascade.Load(filenameFaceCascade))
            {
                Console.WriteLine("error");
                return;
            }

            video.Read(frame);

            // detect
            Rect[] faces = faceCascade.DetectMultiScale(frame);
            Console.WriteLine(faces.Length);

            foreach (var item in faces)
            {
                Cv2.Rectangle(frame, item, Scalar.Red); // add rectangle to the image
                Console.WriteLine("faces : " + item);
            }

            // display
            pictureBoxIpl1.ImageIpl = frame;

            Cv2.WaitKey(sleepTime);
        }
    }
}

 

[첨부(Attachment)]

Form1.7z

 


6. 시연하기(Demonstrate)

 

 


7. 참고자료(Reference)

 

1. [C#](OpenCVSharp 4) - c#에서 OpenCV 카메라 열기와 처음 시작하기, Last Modified 2019-11-10, Accessed by 2019-11-11, https://yyman.tistory.com/1350?category=809859

2. opencv/haarcascade_frontalface_alt.xml at master · opencv/opencv , Last Modified , Accessed by 2019-11-11,

https://github.com/opencv/opencv/blob/master/data/haarcascades/haarcascade_frontalface_alt.xml

3. opencv/opencv: Open Source Computer Vision Library, Last Modified, Accessed by 2019-11-11,

https://github.com/opencv/opencv

4. Releases · shimat/opencvsharp, Last Modified 2019-11-10, Accessed by 2019-11-11, https://github.com/shimat/opencvsharp/releases

반응형
728x90
300x250
[C#](OpenCVSharp 4) - Image 출력하기
 

Microsoft C# OpenCVSharp 4로 그림을 출력하는 방법에 대해서 간단하게 소개하겠습니다.
(Here's a quick introduction to how to print a picture with Microsoft C # OpenCVSharp 4.)

 


1. 사용자 인터페이스 설계(User Interface Design)

 

아래의 그림은 사용자 인터페이스를 설계한 것입니다. 콘솔환경이 아니라 윈도우 환경에서 시연하였습니다.
(The figure below shows the design of the user interface. It was demonstrated in the Windows environment, not the console environment.)

 

 


2. 폼 Load 기능 설계(Form Load Function Design)

 

폼 기능 설계입니다. 솔루션 탐색기 아래에 Form1로 선택하시고 번개표시를 클릭하면 아래의 그림을 볼 수 있습니다.

Load의 빈 칸을 더블클릭하면 코드를 생성할 수 있습니다.
(Form feature design.
Select Form1 under Solution Explorer and click the lightning bolt to see the figure below.You can generate code by double clicking on the blank of Load.)

 

 


3. 코드 작성(Write the code)

 

코드를 입력하면 됩니다.(Just enter the code.)

 

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using OpenCvSharp;


namespace OpenCVSharpImage
{
    public partial class Form1 : Form
    {

        Mat image;


        public Form1()
        {
            InitializeComponent();
        }


        private void Form1_Load(object sender, EventArgs e)
        {

            image = Cv2.ImRead("cat.jpg", ImreadModes.Grayscale);
            // Cv2.ImShow("image", image);
            // Cv2.WaitKey(0);
            // Cv2.DestroyAllWindows();

            pictureBoxIpl1.ImageIpl = image;


        }

    }

}

 

첨부(Attachment)

191110 - cat.7z // 사진 파일


4. 완성(complete)

 

그레이 형태로 완성이 되었습니다.

 

완성된 모습입니다.(It's finished.)

 


5. 영상으로 시연된 모습 구경하기(Watch the video demonstration)

 

OpenCVSharp 4 그림 출력에 대해서 시연하였습니다.
(Demonstration of OpenCVSharp 4 figure output.)

 

 

 

반응형
728x90
300x250

[C#](OpenCVSharp 4) - c#에서 OpenCV 카메라 열기와 처음 시작하기

 

안녕하세요. C#에서 OpenCV를 활용할 수 있는 방법에 대해서 소개하려고 합니다.

 

 

프로젝트->NuGet 패키지 관리를 클릭하면 위의 그림을 살펴볼 수 있습니다.

OpenCVSharp4라고 검색한 후 설치하면 됩니다. 

 

 


2. 몇 가지 흥미로운 문제

 

소스코드는 다음과 같습니다.

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using OpenCvSharp;


namespace OpenCV_Sample
{

    public partial class Form1 : Form
    {
        VideoCapture video;
        Mat frame = new Mat();

  
        public Form1()
        {
            InitializeComponent();
        }

 

}

 

정상적인 경우라면, 자연스럽게 빈화면을 출력해야 합니다.

그러나 아래처럼 오류가 발생합니다.

 

"내부 예외 2개 중 2개"
...... DllNotFoundException: DLL 'OpencvSharpExtern'을(를) 로드할 수 없습니다. 지정된 모듈을 찾을 수 없습니다.

 

 

 

 

 

아래의 사이트에서 프로젝트를 다운받습니다.

https://github.com/shimat/opencvsharp/releases

 

 

CPU 기종과 운영체제 기종에 맞춰서 다운받길 바랍니다.

64bit 운영체제와 64비트 CPU를 사용하고 있어서 OpenCVSharp-4.1.1-x64-20191023.zip을 내려받습니다.

 

[첨부(Attachment)]

OpenCVSharp4-master64bit.z01

OpenCVSharp4-master64bit.z02

OpenCVSharp4-master64bit.zip

 

 

압축해제한 폴더에서 "OpenCvSharpExtern.dll"을 복사합니다. 용량이 꽤 됩니다. 59,527KB(약 60Mb) 정도 됩니다.

작업중인 프로젝트 폴더에 복사해서 붙여넣어줍니다.

 

경로 찾는 방법
C:\사용자\{사용자명}\source\repos\{프로젝트명}\{프로젝트명}

 

 

다음의 단계를 그림에 맞춰서 진행해줍니다.

 

 

 

 

 

OpenCvSharpExtern.dll을 선택합니다.

 

 

그리고 우측 솔루션 탐색기에서 OpenCVSharpExtern.dll을 클릭 후 속성을 바꿔줍니다.

"출력 디렉터리에 복사"에 "항상 복사"로 바꿔줍니다.

 


2-1. dll 기종(예: 64bit이다. 또는 32bit이다.)에 맞춰주기

 

지금의 작업은 OpenCV의 기종에 맞춰서 빌드 환경을 바꿔줄 것입니다.

"Any CPU"를 클릭 후 "구성관리자"를 클릭합니다.

 

 

플랫폼에서 "Any CPU"를 클릭 후 "<새로 만들기...>"을 클릭합니다.

 

 

x64로 변경하고 확인을 클릭합니다.

 

 

변경이 된 것을 확인할 수 있습니다.

 

 


3. 사용자 인터페이스(User Interface)

 

PictureBoxlpl을 배치하고, Timer를 배치합니다.

 

 

 

 


4. 소스코드(Source Code)

 

소스코드는 아래와 같습니다.

 

namespace OpenCV_Sample
{
    public partial class Form1 : Form
    {
        VideoCapture video;
        Mat frame = new Mat();

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            try
            {
                video = new VideoCapture(0);
                video.FrameWidth = 640;
                video.FrameHeight = 480;
            }
            catch
            {
                timer1.Enabled = false;
            }
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            video.Read(frame);
            pictureBoxIpl1.ImageIpl = frame;
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            frame.Dispose();
        }

    }

}

 

카메라를 시연하도록 하겠습니다. 얼굴은 모자이크 하였습니다.

 

 

 

[첨부(Attachment)]

OpenCV-Sample.z01

OpenCV-Sample.z02

OpenCV-Sample.z03

OpenCV-Sample.zip

 

 

반응형
728x90
300x250
[MySQL(또는 MariaDB)] Debian 10에서 외부 접속 허용하기

 

1. 외부 접속 허용해주기

 

$ sudo vi /etc/mysql/my.cnf을 열어보면 bind-address = 127.0.0.1 라는 부분이 있다.
이 부분을 주석 처리 하고 아래처럼 해준다.

 

#bind-address            = 127.0.0.1
bind-address            = *

 

2. Maria DB(또는 MySQL)에서 네트워크 대역 허용해주기

 

모든 IP 대역 네트워크

INSERT INTO mysql.user (host,user,password) VALUES ('%','root',password('패스워드'));
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';
FLUSH PRIVILEGES; 


특정 IP 대역 네트워크

INSERT INTO mysql.user (host,user,password) VALUES ('192.168.0.%','root',password('패스워드'));
GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.0.%';
FLUSH PRIVILEGES;


3. 복구

 

모든 IP 대역 네트워크 복구하기

 

DELETE FROM mysql.user WHERE Host='%' AND User='root';
FLUSH PRIVILEGES;


특정 IP 대역 네트워크 복구하기

 

DELETE FROM mysql.user WHERE Host='192.168.0.%' AND User='root';
FLUSH PRIVILEGES;

 

 


[자주 나오는 오류]

 

ERROR 1364 (HY000): Field 'ssl_cipher' doesn't have a default value
Mysql 버전이 높아지면서 보안관련 인한 오류입니다.

User 생성시 Host, User ,Password, ssl_cipher, x509_issuer, x509_subject 를 입력 해 주셔야 합니다.
ssl_cipher, x509_issuer, x509_subject 값은 '' 빈값을 입력하세요.

ex)
 insert into user (Host, User, Password, ssl_cipher, x509_issuer, x509_subject )
values('localhost','사용자명',password('비밀번호'),'','','');

 

ERROR 1364 (HY000): Field 'authentication_string' doesn't have a default value

* mysql 5.5 에서 user 생성시 authentication_string 필드 추가. '' 값으로 넣어 주세요.


ex)
insert into user (Host, User, Password, ssl_cipher, x509_issuer, x509_subject, authentication_string)

values('localhost','사용자명', password('비밀번호'),'','','','');

반응형
728x90
300x250
[GNU(리눅스) 데비안 10.1 - 파일/폴더 압축 및 해제

 

데비안 10.1에서 파일/폴더 압축 및 해제하는 방법에 대해서 소개합니다.

데비안 10.1에서 .zip 등을 사용하려면 먼저 설치를 해주어야 합니다.

 

apt install zip

......

 

아래의 사용 방법은 동일합니다.

 

.zip

압축

$ zip -r [압축파일명.zip] [압축할 파일/디렉토리]


압축 해제

$ unzip [압축파일명.zip]


.tar

압축

$ tar cf [압축파일명.tar] [압축할 파일/디렉토리]


압축 해제

$ tar xf [압축파일명.tar]


tar.gz

압축

$ tar zcf [압축파일명.tar.gz] [압축할 파일/디렉토리]


압축 해제

$ tar xfz [압축파일명.tar.gz]


.tar.bz2

압축

$ tar jcf [압축파일명.tar.bz2] [압축할 파일/디렉토리]


압축 해제

$ tar xfj [압축파일명.tar.bz2]


.tar.xz - 이중으로 압축을 풀어야 합니다.

압축 해제 (.xz 압축 해제 -> tar 압축 해제)

$ xz -d [압축파일명.tar.xz]

$ tar -xf [압축파일명.tar]

반응형
728x90
300x250

[C++(GTKmm)] Anjuta에서 GTKmm 시작하기

안주타에서 GTKmm을 사용하는 방법에 대해서 소개합니다.

 

Operation System(운영체제) Debian 9.9
개발 언어 gtkmm-3.0

 


1. 안주타로 GTKmm 헬로우 월드 실행하기

1-1. 안주타 실행하기

시작 메뉴에서 "개발"-> "안주타(Anjuta)"를 클릭하면 실행할 수 있습니다.

"Create a new Project"를 클릭합니다.

C++탭을 클릭하고 "GTKmm (단순)"을 클릭하고 "다음(N)"을 누릅니다.

Warning이라고 해서 mMissing packages: gtkmm-3.0.이 나옵니다.

시작 메뉴에서 "시스템 도구"->"터미널"을 클릭합니다.

터미널에 아래의 명령어를 입력해주도록 합니다.

# apt-get install gtkmm-3.0

 

 


1-2. 프로젝트 생성하기

터미널에서 설치를 완료 후 "Install Missing packages"를 클릭하면 아래의 창이 뜹니다. 기본 정보를 입력 후 "다음(N)"을 클릭해줍니다.

다음은 프로젝트 옵션입니다.

옵션을 설정 후 "다음(N)"을 클릭합니다.

"적용"을 클릭합니다.


1-3. 안주타에 내장되어 있는 디자이너

글래이드를 설치하면, 전문적인 사용자 인터페이스 디자이너를 사용할 수 있습니다.

 


1-4. 빌드하기 및 libtool-bin설치하기
빌드(B)에서 프로젝트 빌드(B)를 클릭합니다.

아래의 창이 뜨면, 실행(E)를 클릭합니다.

libtool이 설치되지 않았다고 오류메시지가 출력되는 것을 확인할 수 있습니다.

터미널 창에 아래의 명령어를 입력합니다.

# apt-get install libtool-bin


1-5. 빌드하고 실행하기

빌드(B)를 클릭하고, Compile (main.cc)을 클릭합니다.

Configure Project 창이 뜹니다.
환경 설정 등을 확인 후 "실행(E)"를 클릭합니다.

실행(R) 메뉴에서 실행을 클릭합니다.

 


2. GTKmm에 대해서 관심있는 분들을 위한 팁&Tip


아래의 사이트에 접속하면 더 많은 정보를 얻을 수 있습니다.
 * https://developer.gnome.org/gtk3/stable/GtkEntry.html
 * https://developer.gnome.org/gnome-devel-demos/3.32/guitar-tuner.cpp.html.ko

 * https://developer.gnome.org/gnome-devel-demos/3.32/index.html.ko

 

기타 조율기

지스트리머는 그놈 멀티미디어 프레임워크입니다. 동영상 오디오 웹캠 스트림 같은걸 재생, 녹음/녹화, 처리할 때 지스트리머를 사용할 수 있습니다. 여기서는 단일 주파수 음색을 만들 때 사용하겠습니다. GStreamermm은 여기서 우리가 사용할 지스트리머 C++ 바인딩입니다. 개념적으로 지스트리머 동작은 다음과 같습니다. (우선) source에서 sink(출력)으로 내보낼 수많은 처리 요소가 들어간 파이프라인을 만듭니다. source는 그림 파일, 동영상,

developer.gnome.org

 

GtkEntry: GTK+ 3 Reference Manual

GtkEntry GtkEntry — A single line text entry field Object Hierarchy GObject ╰── GInitiallyUnowned ╰── GtkWidget ╰── GtkEntry ├── GtkSearchEntry ╰── GtkSpinButton Includes #include Description The GtkEntry widget is a single line text entry widget. A fairly

developer.gnome.org

 

그놈 개발자 플랫폼 데모

이 안내서는 그림 보기, 날씨 프로그램 과 같은 다양한 코드 예제를 담고 있습니다. 다양한 맛보기 프로그램에 여러분이 따라해볼 수 있는 코드, 예제 동작 설명을 함께 넣었습니다. 그놈 개발자 플랫폼을 시작해볼 수 있는 멋진 수단입니다.

developer.gnome.org

 

반응형
728x90
300x250

[MFC] Visual C++ 2019(C++ MFC)에서 Maria DB 연동하기

마리아 DB를 Visual C++ 2019(C++ MFC)에서 사용하는 방법을 소개하겠습니다.

 

1단계: 프로젝트 생성하기

Visual Studio 2019를 켭니다.

 

"새 프로젝트 만들기"를 클릭합니다.

 

 

"MFC 앱"을 클릭합니다.

 

프로젝트 이름을 정한 후 다음을 누릅니다.

이번 예제에서는 "대화 상자 기반"으로 하였습니다.
"대화 상자 기반"을 클릭합니다.

"다음"을 누릅니다.

 

주 프레임 스타일의 체크를 "해제"합니다.

"다음"을 클릭합니다.

"인쇄 및 인쇄 미리 보기(P)", "ActiveX 컨트롤(R)"을 체크 해제합니다.

"다음"을 클릭합니다.

생성된 클래스의 이름 등을 확인하고 "마침"을 클릭합니다.

 

 

2단계: Maria DB Connector(MySQL Connector)

DB 사용 방법은 MySQL과 Maria DB는 동일하나 Connector 등에서 일부 이름이 변경되었습니다.


(MySQL Connectors)
https://dev.mysql.com/downloads/connector/

 

MySQL :: MySQL Connectors

MySQL Connectors MySQL offers standard database driver connectivity for using MySQL with applications and tools that are compatible with industry standards ODBC and JDBC. Any system that works with ODBC or JDBC can use MySQL. Standardized database driver f

dev.mysql.com

(Maria Connectors)
https://downloads.mariadb.org/

 

Downloads - MariaDB

 

downloads.mariadb.org

3단계: libmariadb.dll 문제

(아래 파일로 작업을 하시는 분들은 64bit로 디버그, 릴리즈하셔야 합니다.
MariaDB 10.4 64bit 버전에서 추출하였습니다.)

lib-mariadb-10.4.7z
2.52MB


4단계: 프로젝트 속성 변경

MariaDB-Connector를 소스 코드 버전으로 다운받은 경우입니다.

C/C++의 경로 설정할 때 변경해주시면 되겠습니다.

예: c:\....\mariadb-connector-c-3.1.2-src\mariadb-connector-c-3.1.2-src\include

 

"프로젝트 속성 창"을 띄우는 방법은 다음과 같습니다.

아래처럼 설정해줍니다.
첫 번째
"VC++ 디렉터리->" 라이브러리 디렉터리 : C:\................\MariaDB XX.X\lib

 

두 번째

"C/C++->추가 포함 디렉터리": C:\................\MariaDB XX.X\include\mysql

또는 c:\....\mariadb-connector-c-3.1.2-src\mariadb-connector-c-3.1.2-src\include
(MySQL 사용자는 mysql-connector.....로 찾아서 할 것)

 

세 번째

"링커->추가 종속성" libmariadb.lib로 설정해주기

(MySQL 사용자는 libmysql.lib로 할 것)

5단계: libmysql.dll 또는 libmariadb.dll 프로젝트에 추가해주기


아래의 그림처럼 libmariadb.dll 또는 libmysql.dll을 추가해줍니다. 참조성 오류를 예방할 수 있습니다.



6단계: 사용자 인터페이스 구현

이쁘게 그려줍니다.

(리스트 박스, 텍스트 박스, 버튼, 그룹 박스)를 사용하였습니다.

"아이디", "이름", "생년월일", "리스트박스"의 "변수"를 지정하였습니다.

변수 지정을 잊어버린 분들을 위해서 아래 그림을 보면 생각이 나게 될 것입니다.

변수는 아래처럼 선택하고 입력하면 되겠습니다.
이름(N)은 "m_txtId"로 하였습니다.
범주(T)는 "값"으로 선택하였습니다.

최대 문자는 적절하게 조절하시면 되겠습니다.

ID 변수명 비고
IDC_TxtID m_TxtId  
IDC_TxtName m_TxtName  
IDC_IDC_DATETIMEPICKER m_txtBirthDate  
IDC_LST_Dataview   Report로 속성 변경하였음.


7단계:

소스 코드는 아래처럼 사용하면 적절할 거 같습니다.

MFCApplication1Dlg.cpp

BOOL CMFCApplication1Dlg::OnInitDialog()
BOOL CMFCApplication1Dlg::OnInitDialog()
{
CDialogEx::OnInitDialog();

// m_lst_dataview
m_lst_dataview.InsertColumn(0, _T("번호"), NULL, 50);
m_lst_dataview.InsertColumn(1, _T("이름"), NULL, 150);
m_lst_dataview.InsertColumn(2, _T("생년월일"), NULL, 20);

// 시스템 메뉴에 "정보..." 메뉴 항목을 추가합니다.

// IDM_ABOUTBOX는 시스템 명령 범위에 있어야 합니다.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != nullptr)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}

// 이 대화 상자의 아이콘을 설정합니다.  응용 프로그램의 주 창이 대화 상자가 아닐 경우에는
//  프레임워크가 이 작업을 자동으로 수행합니다.
SetIcon(m_hIcon, TRUE); // 큰 아이콘을 설정합니다.
SetIcon(m_hIcon, FALSE); // 작은 아이콘을 설정합니다.

// TODO: 여기에 추가 초기화 작업을 추가합니다.

return TRUE;  // 포커스를 컨트롤에 설정하지 않으면 TRUE를 반환합니다.
}
void CMFCApplication1Dlg::OnBnClickedBtnSubmit()
void CMFCApplication1Dlg::OnBnClickedBtnSubmit()
{
CString strTxt = CString(_T("안녕하세요"));
MessageBoxW( (LPCTSTR) strTxt );

UpdateData(TRUE); // 필드 값 최신화
MessageBox((LPCTSTR)m_txtId, _T("알림(Alert)"), MB_ICONINFORMATION);
}
void CMFCApplication1Dlg::OnBnClickedBtnDataload()
void CMFCApplication1Dlg::OnBnClickedBtnDataload()
{

LVITEM firstitem;

char* host = "hostName";
char* userId = "userID";
char* passwd = "passwd";
char* dbName = "dbName";
int port = 3306;

/* MariaDB(MySQL 연동) */
MYSQL mysql;
MYSQL_RES* res;
MYSQL_ROW row;

mysql_init(&mysql);
if (mysql_real_connect(&mysql, host, userId, passwd, dbName, port, NULL, 0) == NULL)
{
return;
}
else {
mysql_query(&mysql, "set names euckr"); // 한글 깨짐 보완
}

char* szQuery = "select * from member";

if (mysql_query(&mysql, szQuery)) {
return;
}

if ((res = mysql_store_result(&mysql)) == NULL) {
return;
}

row = mysql_fetch_row(res);

while (row)
{
std::string name = row[1];
std::string type = row[2];

CString tmp;
tmp = name.c_str();

firstitem = { 0 };

firstitem.mask = LVIF_TEXT;
firstitem.iItem = 0;

// 데이터 삽입 - Firstitem
m_lst_dataview.InsertItem(&firstitem);

// 데이터 값 넣기 - Firstitem
m_lst_dataview.SetItemText(0, 0, _T("1번"));
m_lst_dataview.SetItemText(0, 1, tmp);
m_lst_dataview.SetItemText(0, 2, _T("도도1-2"));

row = mysql_fetch_row(res);
}

mysql_free_result(res);

mysql_close(&mysql);

}
void CMFCApplication1Dlg::OnBnClickedBtnDatainsert()
void CMFCApplication1Dlg::OnBnClickedBtnDatainsert()
{
LVITEM firstitem;

char* host = "hostName";
char* userId = "userID";
char* passwd = "passwd";
char* dbName = "dbName";
int port = 3306;

/* MariaDB(MySQL 연동) */
MYSQL mysql;
MYSQL_RES* res;
MYSQL_ROW row;

UpdateData(TRUE); // 필드 값 최신화

mysql_init(&mysql);
if (mysql_real_connect(&mysql, host, userId, passwd, dbName, port, NULL, 0) == NULL)
{
return;
}
else {
mysql_query(&mysql, "set names euckr"); // 한글 깨짐 보완
}

const int KO_KR_MAX_SIZE = 128; // 한글 지원(여유공간)
CString csTemp = (LPCTSTR)m_txtId;
char* strName = new char[(strlen(CT2A(csTemp)) + 1) + KO_KR_MAX_SIZE];
strcpy_s(strName, sizeof(strName) + KO_KR_MAX_SIZE, CT2A(csTemp));

CTime cTime = m_txtBirthDate.GetYear();

csTemp.Empty();
csTemp.Format(_T("%04d-%02d-%02d %d:%d:%d"), m_txtBirthDate.GetYear(),
m_txtBirthDate.GetMonth(),
m_txtBirthDate.GetDay(),
m_txtBirthDate.GetHour(),
m_txtBirthDate.GetMinute(),
m_txtBirthDate.GetSecond());


char* strBirthDate = new char[(strlen(CT2A(csTemp)) + 1) + KO_KR_MAX_SIZE];
strcpy_s(strBirthDate, sizeof(strBirthDate) + KO_KR_MAX_SIZE, CT2A(csTemp));

char szQuery[256 + KO_KR_MAX_SIZE];
int len = sprintf_s(szQuery, sizeof(szQuery), "insert into member(name, birthdate) values('%s', '%s')", strName, strBirthDate);

if (mysql_query(&mysql, szQuery)) {
return;
}

int check = _CrtDumpMemoryLeaks();

mysql_close(&mysql);

}



* 참고(Reference):

1. CWnd::MessageBox | Microsoft Docs, https://docs.microsoft.com/en-us/previous-versions/0eebkf6f(v=vs.140) Last Modified 2019-07-23, Accessed by 2019-07-23
2. CWnd 클래스 | Microsoft Docs, https://docs.microsoft.com/ko-kr/cpp/mfc/reference/cwnd-class?view=vs-2019#messagebox Last Modified 2019-07-23, Accessed by 2019-07-23
3. MariaDB Connector/C - MariaDB, https://downloads.mariadb.org/connector-c/, Last Modified 2019-07-23, Accessed by 2019-07-23
4. GitHub - viaduck/mariadbpp: C++ client library for MariaDB. Continuation of https://code.launchpad.net/mariadb++, https://github.com/viaduck/mariadbpp, Last Modified 2019-07-23, Accessed by 2019-07-23

반응형
728x90
300x250

[C#.NET] - MySQL Blob 이미지 읽기, 저장하기

이번에 소개할 것은 C#에서 MySQL Blob를 사용하는 방법에 대해서 소개하려고 합니다.

1. 사용자 인터페이스 구현

그림1) 사용자 인터페이스 설계

c#에서 위의 그림처럼 작성합니다.

2. MySQL - Blob (이미지 저장)

        private void Btn_Save_Click(object sender, EventArgs e)
        {
            string SQL;
            UInt32 FileSize;
            byte[] rawData;
            FileStream fs;

            string ConString = "Server=hostName;Database=dbName;" +
                               "Uid=userID;Pwd=userPasswd;";

            MySqlConnection con = new MySqlConnection(ConString);
            MySqlCommand cmd = new MySqlCommand();
            BinaryReader br;
            try
            {
                fs = new FileStream(@txtPath.Text, FileMode.Open, FileAccess.Read);
                FileSize = (UInt32)fs.Length;

                rawData = new byte[FileSize];
                fs.Read(rawData, 0, (int)FileSize);
                fs.Close();

                con.Open();

                SQL = "INSERT INTO blob_tbl VALUES(NULL, @FileName, @FileSize, @File)";

                cmd.Connection = con;
                cmd.CommandText = SQL;
                cmd.Parameters.AddWithValue("@FileName", txtPath.Text);
                cmd.Parameters.AddWithValue("@FileSize", FileSize);
                cmd.Parameters.AddWithValue("@File", rawData);

                cmd.ExecuteNonQuery();

                MessageBox.Show("File Inserted into database successfully!",
                    "Success!", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);

                con.Close();
            }
            catch (MySql.Data.MySqlClient.MySqlException ex)
            {
                MessageBox.Show("Error " + ex.Number + " has occurred: " + ex.Message,
                    "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            } // end of try to catch finally

        }
표1) 이미지 저장 소스코드



2. MySQL - Blob (이미지 읽기)

        private void Btn_dbLoad_Click(object sender, EventArgs e)
        {
            string SQL;
            string FileName;
            UInt32 FileSize;
            byte[] rawData;
            FileStream fs;

            string ConString = "Server=hostName;Database=dbName;" +
                               "Uid=userID;Pwd=userPasswd;";

            MySqlConnection con = new MySqlConnection(ConString);
            MySqlCommand cmd = new MySqlCommand();


            string query = "SELECT * from blob_tbl";

            try
            {
                con.Open();

                cmd.Connection = con;
                cmd.CommandText = query;

                MySqlDataReader myData = cmd.ExecuteReader();

                if (!myData.HasRows)
                    throw new Exception("There are no BLOBs to save");

                myData.Read();

                FileSize = myData.GetUInt32(myData.GetOrdinal("filesize"));
                rawData = new byte[FileSize];

                myData.GetBytes(myData.GetOrdinal("file"), 0, rawData, 0, (int)FileSize);

                FileName = @System.IO.Directory.GetCurrentDirectory() + "\\newfile.png";

                fs = new FileStream(FileName, FileMode.OpenOrCreate, FileAccess.Write);
                fs.Write(rawData, 0, (int)FileSize);
                fs.Close();

                MessageBox.Show("File successfully written to disk!",
                    "Success!", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);

                pbBlobImg.Image = Image.FromFile(FileName);

                myData.Close();
                con.Close();
            }
            catch (MySql.Data.MySqlClient.MySqlException ex)
            {
                MessageBox.Show("Error " + ex.Number + " has occurred: " + ex.Message,
                    "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
      }
표2) 이미지 읽기 소스코드

4. 소스코드

Blob.zip
1.57MB



5. 데이터베이스 설계

그림2) 데이터베이스 설계

6. 시연

그림3) 시연하기

 

 

7. 참고자료(Reference)

 

MySQL :: MySQL Connector/NET Developer Guide :: 5.9.2 Writing a File to the Database

5.9.2 Writing a File to the Database To write a file to a database, we need to convert the file to a byte array, then use the byte array as a parameter to an INSERT query. The following code opens a file using a FileStream object, reads it into a byte arra

dev.mysql.com

https://dev.mysql.com/doc/connector-net/en/connector-net-programming-blob-writing.html

 

반응형

+ Recent posts