C#에서 16bit grayscale PNG 파일을 Bitmap.FromFile 또는 Image.FromFile로 읽을 시 32bit argb 4바이트로 변환되어 읽게 된다.

16bit gray 이미지를 얻기 위해서는 다음과 같이 처리한다.

 


 

Stream imageStreamSource = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read);PngBitmapDecoder decoder = new PngBitmapDecoder(imageStreamSource, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
BitmapSource bitmapSource = decoder.Frames[0];
int stride = (int)bitmapSource.PixelWidth * (bitmapSource.Format.BitsPerPixel / 8);
byte[] data = new byte[(int)bitmapSource.PixelHeight * stride];


bitmapSource.CopyPixels(data, stride, 0);

PNG 파일을 FileStream으로 읽고 PngBitmapDecoder로 BitmapSource를 얻는다.

그후 CopyPixels로 raw데이터를 복사한다.

 

'프로그래밍 > C#' 카테고리의 다른 글

Window class name is not valid  (0) 2014.08.06
C# array char to String 변환  (0) 2013.08.14
쓰레드 종료 지연 문제  (0) 2013.08.14
변수 타입  (0) 2013.08.14

 

Window class name is not valid.

임베디드 상황에서 C# 으로 개발 했더니, 저런 오류를 토해낸다. 그것도 매번이 아닌가~~끔.

이 에러 메시지의 원인은 폼에서 자식 윈도우(컨트롤)을 생성할 때, 생성 할 수 없을 때 발생한다.

(comctl32.dll 과 관련이 있을지도..)

원인은 글쎄 못 찾겠다..

 

'프로그래밍 > C#' 카테고리의 다른 글

PNG 16bit grayscale 데이터 읽기  (0) 2022.03.15
C# array char to String 변환  (0) 2013.08.14
쓰레드 종료 지연 문제  (0) 2013.08.14
변수 타입  (0) 2013.08.14

C로 작성된 서버에서 네트워크로 문자열 패킷을 수신했다. 이를 String 으로 변환하려


string msg = new string(msg_data);

위와 같이 했을 경우, msg_data에 패킷 문자열을 고정시키기 위해 실 문자는 5개 문자열만 있지만 실제 데이터 크기가 60개라면 \0로 문자열 끝을 가리키는 문자로 채워진다. string msg에 \0도 문자열로 판단하여 공백이 발생한다. 이는 Trim함수로 공백을 제거하려 해도 되지 않는다. \0 문자로 삭제해야 한다.

msg.TrimEnd(‘\0’);

'프로그래밍 > C#' 카테고리의 다른 글

PNG 16bit grayscale 데이터 읽기  (0) 2022.03.15
Window class name is not valid  (0) 2014.08.06
쓰레드 종료 지연 문제  (0) 2013.08.14
변수 타입  (0) 2013.08.14

FtpRequest를 이용한 FTP 클라이언트를 만드는 도중, 폼이 종료 할때 종료가 지연되는 문제가 발생했다.

원인을 파악해 보니 접속되지 않는 주소에 연결을 하게 될 경우나 파일 전송중에 종료를 하게 되니 발생하는 문제였다.

Thread의 Abort 기능이나 interrupt 로 처리해 보았지만, 여전히 문제는 해결되지 않았다. 그러던중 IsBackground라는 속성을 알게 되었는데 이 IsBackground에 대한 설명은 msdn에 다음과 같이 설명되어 있다.

http://msdn.microsoft.com/ko-kr/library/system.threading.thread.isbackground.aspx

스레드가 배경 스레드인지 여부를 나타내는 값을 가져오거나 설정합니다.

네임스페이스: System.Threading
어셈블리: mscorlib(mscorlib.dll)

public bool IsBackground { get; set; }
속성 값
형식: System.Boolean

이 스레드가 백그라운드 스레드이거나 백그라운드 스레드가 될 예정이면 true이고, 그렇지 않으면 false입니다.

배경 스레드는 프로세스의 종료를 막지 않는다는 점을 제외하고 전경 스레드와 동일합니다. 프로세스에 속해 있는 모든 전경 스레드가 중단되면 공용 언어 런타임에서 프로세스를 끝냅니다. 나머지 배경 스레드는 모두 중지되며 완료되지 않습니다.

Thread WorkThread = new Thread(new ThreadStart(WorkProc));
WorkThread.IsBackgound = true;

위와 같이 처리하면 종료 시 지연 되는 문제는 없어진다. Foreground 쓰레드는 생성된 후 자신의 작업이 끝날때 까지 종료되지 않는다. 그래서 메인 쓰레드가 종료되더라도 쓰레드가 종료 될 때까지 대기 상태로 머무르게 된다. Background는 주 쓰레드를 대신하여 작업을 대신 하는 것이므로 진입 메소드가 종료되면 쓰레드가 끝나는 것으로 자연스럽게 표현된다고 한다.

Thread의 abort는 기존 TherminateThread 와 같은 기능은 아닌것 같고 ThreadAbortException을 발생 시킨다고 한다. 또한 intterupt는 ThreadInterruptedException을 발생시킨다.

'프로그래밍 > C#' 카테고리의 다른 글

PNG 16bit grayscale 데이터 읽기  (0) 2022.03.15
Window class name is not valid  (0) 2014.08.06
C# array char to String 변환  (0) 2013.08.14
변수 타입  (0) 2013.08.14
변수
 - 변수란, 데이터를 담을수 있는 메모리 이며, 메모리를 가르키는 이름이다.

- 데이터형
byte       1바이트
char       2바이트
int          4바이트
long       8바이트
float       4바이트
double   8바이트
decimal  16바이트
bool       1바이트

* built-in
각 데이터형은 기본적으로 위에서 표기된 정해진 메모리를 할당한다.


사용법 예제

int a;

a = 5;
a = 20;

a라는 변수는 int 데이터형을 나타낸다.
a 라는 변수에 5를 저장한다.
(a가 가르키는 메모리에 숫자 5를 저장한다.)
a 라는 변수에 10을 저장한다.


'프로그래밍 > C#' 카테고리의 다른 글

PNG 16bit grayscale 데이터 읽기  (0) 2022.03.15
Window class name is not valid  (0) 2014.08.06
C# array char to String 변환  (0) 2013.08.14
쓰레드 종료 지연 문제  (0) 2013.08.14

+ Recent posts