[ C# ] 씨샵 Bitmap To ByteArray 변환 및 설명

[ C# ] 씨샵 Bitmap To ByteArray 변환 및 설명



1. 필수 using

    using System.Drawing;
    using System.Drawing.Imaging;
    using System.Runtime.InteropServices;



2. Bitmap 이미지 불러오기

    using(Bitmap bitmap = new Bitmap(@"C:\Users\Heo\Downloads\IMAGE.jpg"))
    {
    }



3. BitmapToByteArray 함수 만들기

        public byte[] BitmapToByteArray(Bitmap bitmap)
        {
            BitmapData bitmapData = null;

            try
            {
                // 이미지 락모드
                bitmapData = bitmap.LockBits(
                    new Rectangle(0, 0, bitmap.Width, bitmap.Height), 
                    ImageLockMode.ReadOnly, bitmap.PixelFormat);
                // 이미지 길이
                int nByteCount = bitmapData.Stride * bitmap.Height;
                byte[] byteArray = new byte[nByteCount];
                // 이미지 메모리 시작점
                IntPtr inPtr = bitmapData.Scan0;
                // 메모리에 복사
                Marshal.Copy(inPtr, byteArray, 0, nByteCount);

                return byteArray;
            }
            finally
            {
                if (bitmapData != null)
                    bitmap.UnlockBits(bitmapData);
            }
        }



4. ImageLockMode

    메서드를 읽거나 픽셀 데이터를 쓸 수 있도록 이미지의 부분을 잠금



5. 전체 소스

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace WindowsFormsApp_BitmapToByteArray
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            using(Bitmap bitmap = new Bitmap(@"C:\Users\Heo\Downloads\IMAGE.jpg"))
            {
                byte[] byteArray = BitmapToByteArray(bitmap);
            }

        }

        public byte[] BitmapToByteArray(Bitmap bitmap)
        {
            BitmapData bitmapData = null;

            try
            {
                // 이미지 락모드
                bitmapData = bitmap.LockBits(
                    new Rectangle(0, 0, bitmap.Width, bitmap.Height), 
                    ImageLockMode.ReadOnly, bitmap.PixelFormat);
                // 이미지 길이
                int nByteCount = bitmapData.Stride * bitmap.Height;
                byte[] byteArray = new byte[nByteCount];
                // 이미지 메모리 시작점
                IntPtr inPtr = bitmapData.Scan0;
                // 메모리에 복사
                Marshal.Copy(inPtr, byteArray, 0, nByteCount);

                return byteArray;
            }
            finally
            {
                if (bitmapData != null)
                    bitmap.UnlockBits(bitmapData);
            }
        }
    }
}


댓글