C#에서 WebP 변환 방법

2023. 8. 11. 15:54· C#
목차
  1. ✅ libwebp.dll를 사용한 WebP 변환
  2. DllImport
  3. Convert
  4. 결과
  5. ✅ libwebp.dll를 사용한 WebP 변환 - 끝

티스토리 블로그 점수가 너무 낮아서 개선사항을 보니 이미지 포맷을 차세대 포맷으로 사용하면 좋다고 합니다. 차세대 이미지 포맷 중 WebP라는 포맷을 사용해보려고 했는데 은근히 변환이 까다롭습니다. 그래서 C#으로 구현하기 위해 방법을 찾아보고 공유합니다.

 

 

 

 

✅ libwebp.dll를 사용한 WebP 변환

 

구글에서 제공하는 WebP 라이브러리를 사용합니다. (WebP이 구글에서 만든 포맷입니다.)

libwebp.dll라이브러리는 C또는 C++로 만들어진 라이브러리이기 때문에 P/Invoke 방식으로 사용할 수 있습니다.

 

libwebp.dll
0.44MB

 

 

 

DllImport

[DllImport("libwebp.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern int WebPEncodeBGR(
	IntPtr ptrIn, int width, int height, int stride, float quality, out IntPtr ptrOut);

[DllImport("libwebp.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern int WebPEncodeLosslessBGR(
	IntPtr ptrIn, int width, int height, int stride, out IntPtr ptrOut);

[DllImport("libwebp.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern int WebPFree(
	IntPtr ptr);

라이브러리를 출력 경로에 복사한 뒤 DllImport로 사용할 준비를 합니다.

 

 

 

Convert

/// <summary>
/// WebP 변환 함수
/// </summary>
/// <param name="bmp">원본 이미지</param>
/// <param name="path">출력 경로</param>
/// <param name="isLossless">무손실 여부</param>
/// <param name="quality">손실 변환일 경우 품질 (1~100)</param>
public void Convert(Bitmap bmp, string path, bool isLossless, int quality = 100)
{
    int size = 0;
    IntPtr unmanagedPtr;
    byte[]? output = null;
    var dataBitmap = bmp.LockBits(
    		new Rectangle(0, 0, bmp.Width, bmp.Height), 
            ImageLockMode.ReadOnly, 
            PixelFormat.Format24bppRgb);

    if (!isLossless)
    {
        size = WebPEncodeBGR(
        		dataBitmap.Scan0, 
                bmp.Width, bmp.Height, dataBitmap.Stride, 
                quality, out unmanagedPtr);
    }
    else
    {
        size = WebPEncodeLosslessBGR(
        		dataBitmap.Scan0, 
                bmp.Width, bmp.Height, dataBitmap.Stride, 
                out unmanagedPtr);
    }

    if (size != 0)
    {
        output = new byte[size];
        Marshal.Copy(unmanagedPtr, output, 0, size);
        bmp.UnlockBits(dataBitmap);
        WebPFree(unmanagedPtr);

        File.WriteAllBytes(path, output);
    }
}

무손실 변환을 제공합니다.

함수가 나뉘어져 있기 때문에 선택할 수 있게 합니다.

 

매개변수

  • bmp : 원본 이미지는 Bitmap 클래스로 전달합니다.
  • path : 변환 결과물의 출력 경로입니다.
  • quality : 1~100 사이의 값을 가지며 100 이상일 경우는 무손실인 듯합니다만 라이브러리 소스코드를 확인해보진 않았습니다.
  • isLossless : true일 경우 WebPEncodeLosslessBGR 함수로 무손실 변환을 수행합니다.

 

 

 

결과

파일 크기가 상당히 줄어드는 결과를 보여줬습니다.

 

 

아래 링크에서 윈도우 S/W로 구현한 결과물을 확인하실 수 있습니다.

 

 

WebP 변환 프로그램

차세대 이미지 포맷인 WebP 변환 프로그램입니다. 이미지 변환을 제공하는 사이트들이 있지만 유료가 아닐 경우 사용에 제한 등 은근히 불편한 점이 많아서 간단하게 쓸 수 있도록 만들었습니다.

stop-eddy.com

 

 

 

 

도움이 되셨다면 커피 한 잔~!

Buy Me A Coffee

 

 

✅ libwebp.dll를 사용한 WebP 변환 - 끝

 

 

  1. ✅ libwebp.dll를 사용한 WebP 변환
  2. DllImport
  3. Convert
  4. 결과
  5. ✅ libwebp.dll를 사용한 WebP 변환 - 끝
'C#' 카테고리의 다른 글
  • string을 byte[]로 , byte[]를 string 으로
  • CS8602 : null 가능 참조에 대한 역참조입니다.
  • WPF .NET 7 에서 NLog 사용법 (json)
  • C# : JSON 사용법
YUNYUN3915
YUNYUN3915

공지사항

  • 블로그 이전 취소

인기 글

태그

  • DataGrid
  • WPF style
  • OnPropertyChanged
  • TreeView
  • WPF 흰색바
  • 어트리뷰트
  • ElementHost
  • Git취소
  • wpf 전역 스타일
  • 문자열 관리
  • 윈도우탐색기
  • WindowsFormsHostingWpfControl
  • wpf
  • CS8602
  • DialogService
  • wpf 폰트
  • C#
  • itemssource
  • Expanding Event
  • PasswordBox DataBinding
  • GIT
  • 메세지팝업
  • RelayCommand
  • IValueConverter
  • ICloneable
  • IDialogService
  • ItemsControl
  • command
  • PasswordBox MVVM
  • TreeViewItem
hELLO · Designed By 정상우.v4.2.0
YUNYUN3915
C#에서 WebP 변환 방법
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.