I'm on your side, when times get rough.

2018.03.01

[C#, WPF] Invert Black-White Bitmap

Filed under: Programming — Peter_KIM @ 11:56
Tags: , , , , ,

원본 Bitmap 파일을 읽고, 단색의 Bitmap 파일로 변환하여 다시 검정색과 흰색을 뒤집는 코드입니다. 기존의 C# 코드에서는 매우 복잡한 알고리즘을 직접 만들어 사용해야 했으나, WPF 관련 라이브러리에서는 이런 작업을 매우 쉽게 할 수 있게 도와줍니다.

  • Bitmap File ==> BirmapImage  ==> WriteableBitmap ==> PNG File
  • 비트맵의 데이터 부분을 배열로 가져오기 위하여 CopyPixels 함수를 이용합니다.
  • 색을 뒤집기 위해서는 비트맵 파일의 헤더를 제외한 데이터 값들의  “0”과 “1”을 바꾸어 주어야 합니다.  0xFF 값으로 XOR 연산을 수행하면 됩니다.
  • 연산이 완료된 데이터를 WritePixels 함수로 Bitmap 이미지에 다시 기록합니다.
public void PrintBitmap(String sBmpFilePath, String sTargetPngFilePath)
{
    List<Byte> lstBmpPrint = new List<byte>();
    BitmapImage oBmpImg = new BitmapImage(new Uri(sBmpFilePath));
    WriteableBitmap oWriteableBmp = InvertBitmapColor(oBmpImg);
 
    PngBitmapEncoder oPngEnc = new PngBitmapEncoder();
    oPngEnc.Frames.Add(BitmapFrame.Create(oWriteableBmp)); 
    using (FileStream oFs = new FileStream(sTargetPngFilePath, FileMode.Create))
        oPngEnc.Save(oFs);
}
public WriteableBitmap InvertBitmapColor(BitmapImage oSrcBmpImg)
{
    FormatConvertedBitmap o1BppBmp = ConvertBitmapFormat(oSrcBmpImg, PixelFormats.BlackWhite);
    WriteableBitmap oWriteableBmp = new WriteableBitmap(o1BppBmp);
    int nStride = oWriteableBmp.BackBufferStride;
 
    Byte[] arrBitmapData = new byte[nStride * oWriteableBmp.PixelHeight];
    oWriteableBmp.CopyPixels(arrBitmapData, nStride, 0);
    // Invert Color
    for (int i = 0; i < arrBitmapData.Length; ++i)
        arrBitmapData[i] ^= 0xFF;
 
    oWriteableBmp.WritePixels(new Int32Rect(00, oSrcBmpImg.PixelWidth, oSrcBmpImg.PixelHeight), arrBitmapData, nStride, 0);
    return oWriteableBmp;
}
public FormatConvertedBitmap ConvertBitmapFormat(BitmapImage oSrcBmpImg, PixelFormat pf)
{
    FormatConvertedBitmap newFormatedBitmap = new FormatConvertedBitmap();
 
    newFormatedBitmap.BeginInit();
 
    newFormatedBitmap.Source = oSrcBmpImg;
    newFormatedBitmap.DestinationFormat = pf;
 
    newFormatedBitmap.EndInit();
 
    return newFormatedBitmap;
}
Advertisements

Leave a Comment »

No comments yet.

RSS feed for comments on this post. TrackBack URI

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

w

Connecting to %s

Blog at WordPress.com.

%d bloggers like this: