상세 컨텐츠

본문 제목

[C#]NuGet패키지관리 Barcodelib설치해서 바코드 이미지 불러오기 만들어보기 _참조(FoxLearn)

<개인공부>/[C#]

by 데브수달 2024. 10. 27. 00:18

본문

728x90
반응형

[C#]NuGet패키지관리 Barcodelib설치해서 바코드 이미지 불러오기 만들어보기 _참조(FoxLearn)

 

using BarcodeStandard;
using SkiaSharp;
using System;
using System.Drawing;
using System.IO;
using System.Windows.Forms;

namespace BarcodeAppDemo
{
    public partial class FrmBarcodeAppDemo : Form
    {
        public FrmBarcodeAppDemo()
        {
            InitializeComponent();
        }

        // TextBox 컨트롤 입력한 데이터 문자열의 이미지가 PicBarcode에 나타남.
        private void btnGenerate_Click(object sender, EventArgs e)
        {
            Barcode barcode = new Barcode();
            Color foreColor = Color.Black;
            Color backColor = Color.Transparent;

            // System.Drawing.Color를 SkiaSharp.SKColorF로 변환
            SKColorF skForeColor = new SKColorF(foreColor.R / 255f, foreColor.G / 255f, foreColor.B / 255f, foreColor.A / 255f);
            SKColorF skBackColor = new SKColorF(backColor.R / 255f, backColor.G / 255f, backColor.B / 255f, backColor.A / 255f);

            // 바코드 생성
            SKImage skImage = barcode.Encode(BarcodeStandard.Type.UpcA, textBox1.Text, skForeColor, skBackColor, (int)(picBarcode.Width * 0.8), (int)(picBarcode.Height * 0.8));

            // SKImage를 Bitmap으로 변환하여 PictureBox에 표시
            picBarcode.Image = SKImageToBitmap(skImage);


        }

        // SKImage를 Bitmap으로 변환하는 메서드
        private Bitmap SKImageToBitmap(SKImage skImage)
        {
            using (var img = skImage.Encode())
            {
                using (var stream = new MemoryStream(img.ToArray()))
                {
                    return new Bitmap(stream);
                }
            }
        }

        private void btnSave_Click(object sender, EventArgs e)
        {
            if (picBarcode.Image == null)
                return;
            using (SaveFileDialog saveFileDialog = new SaveFileDialog() { Filter = "PNG|*.png" })
            {
                if (saveFileDialog.ShowDialog() == DialogResult.OK)
                {
                    picBarcode.Image.Save(saveFileDialog.FileName);
                }
            }
        }

    }
}

코드 설명
1.네임스페이스 및 라이브러리 포함:

csharp


using BarcodeStandard;
using SkiaSharp;
using System;
using System.Drawing;
using System.IO;
using SysteWindows.Forms;


BarcodeStandard: 바코드 생성 라이브러리입니다.
SkiaSharp: 2D 그래픽을 위한 라이브러리로, 바코드를 표현하는 데 사용됩니다.
System.Drawing: .NET의 기본 그래픽 라이브러리로, 이미지 처리에 사용됩니다.
System.IO: 파일 입출력 작업을 위한 라이브러리입니다.
System.Windows.Forms: Windows Forms 애플리케이션을 만들기 위한 라이브러리입니다.


2.폼 클래스 정의:

csharp


public partial class FrmBarcodeAppDemo : Form
{
    public FrmBarcodeAppDemo()
    {
        InitializeComponent();
    }
}


FrmBarcodeAppDemo 클래스는 Windows Forms 애플리케이션의 기본 폼을 정의합니다.
InitializeComponent()는 폼의 구성 요소를 초기화합니다.
3. 바코드 생성 버튼 클릭 이벤트:

csharp


private void btnGenerate_Click(object sender, EventArgs e)
{
    Barcode barcode = new Barcode();
    Color foreColor = Color.Black;
    Color backColor = Color.Transparent;

    // Systehttp://m.Drawing.Color를 SkiaSharp.SKColorF로 변환
    SKColorF skForeColor = new SKColorF(foreColor.R / 255f, foreColor.G / 255f, foreColor.B / 255f, foreColor.A / 255f);
    SKColorF skBackColor = new SKColorF(backColor.R / 255f, backColor.G / 255f, backColor.B / 255f, backColor.A / 255f);
    
    // 바코드 생성
    SKImage skImage = barcode.Encode(BarcodeStandard.Type.UpcA, textBox1.Text, skForeColor, skBackColor, (int)(picBarcode.Width * 0.8), (int)(picBarcode.Height * 0.8));

    // SKImage를 Bitmap으로 변환하여 PictureBox에 표시
    picBarcode.Image = SKImageToBitmap(skImage);
}


btnGenerate_Click: 버튼 클릭 시 호출되는 이벤트 핸들러입니다.
Barcode barcode = new Barcode();: 새로운 바코드 객체를 생성합니다.
Color foreColor와 Color backColor: 바코드의 전경색(검정색)과 배경색(투명)을 설정합니다.
SKColorF: SkiaSharp에서 사용하는 색상 타입으로, 0~1 범위의 실수형으로 색상을 표현합니다.
barcode.Encode(...): 바코드를 생성하고, UPC-A 형식으로 인코딩합니다. 사용자 입력(textBox1.Text)을 바코드 데이터로 사용합니다.
picBarcode.Image = SKImageToBitmap(skImage);: 생성된 바코드 이미지를 PictureBox에 표시합니다.


4. SKImage를 Bitmap으로 변환하는 메서드:

csharp


private Bitmap SKImageToBitmap(SKImage skImage)
{
    using (var img = skImage.Encode())
    {
        using (var stream = new MemoryStream(img.ToArray()))
        {
            return new Bitmap(stream);
        }
    }
}


SKImageToBitmap: SkiaSharp의 SKImage를 Systehttp://m.Drawing.Bitmap으로 변환하는 메서드입니다.
skImage.Encode(): SKImage를 인코딩하여 바이트 배열로 변환합니다.
MemoryStream: 바이트 배열을 메모리 스트림으로 변환하여 Bitmap 객체를 생성합니다.


5. 바코드 저장 버튼 클릭 이벤트:

csharp


private void btnSave_Click(object sender, EventArgs e)
{
    if (picBarcode.Image == null)
        return;

    using (SaveFileDialog saveFileDialog = new SaveFileDialog() { Filter = "PNG|*.png" })
    {
        if (saveFileDialog.ShowDialog() == DialogResult.OK)
        {
            Bitmap bitmap = (Bitmap)picBarcode.Image;
            bitmap.Save(saveFileDialog.FileName, Systehttp://m.Drawing.Imaging.ImageFormat.Png);
        }
    }
}


btnSave_Click: 저장 버튼 클릭 시 호출되는 이벤트 핸들러입니다.
if (picBarcode.Image == null) return;: 이미지가 없으면 메서드를 종료합니다.
SaveFileDialog: 사용자가 파일을 저장할 경로와 이름을 선택할 수 있도록 합니다.
bitmap.Save(...): 선택한 경로에 PNG 형식으로 이미지를 저장합니다.

 



UPC-A 바코드 형식 설명
구조:

UPC-A 바코드의 구성에 대해 더 정확하게 설명하겠습니다.

UPC-A 바코드는 총 12자리 숫자로 구성되며, 일반적으로 다음과 같은 방식으로 해석됩니다:

첫 번째 자리 (0): 지리적 영역 또는 업종 식별자로 사용됩니다. 

예를 들어, 0은 일반 제품을 나타내며, 특정 국가나 지역에 대한 정보는 아닙니다.

두 번째 자리부터 열한 번째 자리까지 (1234567891):

제조업체 코드: 일반적으로 첫 6자리 또는 7자리는 제조업체를 식별합니다. 이 코드는 GS1에서 할당됩니다.
제품 코드: 나머지 5자리(또는 4자리)는 특정 제품을 식별합니다. 이 부분은 제조업체가 관리합니다.


열두 번째 자리 (2): 체크 디지트입니다. 

바코드의 정확성을 검증하기 위해 사용됩니다. 체크 디지트는 이전 11자리의 숫자를 기반으로 계산됩니다.

따라서, 012345678912에서:

0: 지리적 또는 업종 식별자
123456: 제조업체 코드
7891: 제품 코드
2: 체크 디지트
891은 제품 코드의 일부로, 특정 제품을 식별하는 데 사용됩니다. 전체 바코드에서 제품을 고유하게 식별하는 역할을 하며, 제조업체가 관리합니다.

이와 같이 UPC-A 바코드는 각 부분이 특정한 의미를 가지며, 전체적으로 제품을 효과적으로 식별할 수 있도록 설계되었습니다. 

UPC-A는 미국과 캐나다에서 주로 사용되며, 국제적으로는 EAN-13과 같은 다른 형식이 더 일반적입니다.

Barcodelib 설치과정

 

C# 아이콘의 프로젝트의 마우스 우측버튼 클릭하면 아래와 같이 나타난다.
NuGet패키지 관리(N).. 클릭한다.
찾아보기에 'BarcodeLib'를 검색하면 위의 작성자 :Brad Barnhill이 만든 라이브러리가 있다. 현재 설치 버전은 3.1.4이다...

https://github.com/barnhill/barcodelib <- 작성자의 깃허브이다. 

해당 라이브러리에 대한 사용예시도 친절하게 설명이 나와있다.

 

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 해당 Barcode()에 대한 객체를 저는 barcode라고 지정했으니,
barcode.includeLabel = True;를 추가하니 바코드가 이미지+ 하단에 Label에 숫자도 같이 나오네요.
아무래도 기본값은 False여서 저희가 임의로 설정해줘야 아래 하단과 같은 바코드 이미지가 나오는 것 같아요. 

 

그리고  Encode 메소드에 대해서 하나하나 순서대로
barcode.encode( 타입지정, '12자리의 숫자 입력: 저희는 이걸 TextBox.text 입력한 내용을 읽어왔죠! ', 전경색, 배경색, 그리고 바코드 이미지의 크기 설정 !!  );


**영상 따라치면서 공부하는데 Type 부분에서 에러가 발생하는데, 그 이유는  System.Type이 있고, 설치한 라이브러리에 대한 Type이 있어서 모호하기 때문에 에러가 발생하는데, 확실하게 설치라이브러리.Type으로 지정해주면 에러는 사라집니다. 

** 속성에 대한 값도 5년전 영상과 달리 lib도 업그레이드 되면서 해당 skbackcolor, skforecolor와 같이 해당 객체를 관련 색상 사용으로 할당해줘야하고, 이미지또한 비트맵으로 바꿔서 표현해줘야한다. 
그래서 skimage를 bitmap으로 바꾸는 메소드를 새로 만들어서 사용하게 되었다. 

마지막으로 공부했던 영상의 출처를 아래와 같이 남겨놓겠다.

https://youtu.be/L15RwgYbo88?feature=shared

진짜 영상이 5년전 4년전이여서 그렇지,, 제일 따라하기 쉽게 정리된 채널이다.
재생목록도 정리가 잘되어있다... 튜토리얼로서는 최고!! 

3년 전에 올라온 영상이 가장 최신이다 ㅠㅠ 계속 올려주세요 ..;;

728x90
반응형

관련글 더보기