12월, 2017의 게시물 표시

[C#/WPF] Stream을 사용해 Image를 BitmapImage로 변환할 때 에러 해결 방법

System.Drawing.Image를 System.Windows.Media.Imaging.BitmapImage로   안녕하세요. 오늘은 아주 기초적이지만 놓치기 쉽다고 생각되는 부분(을 겪은 제 상황)을 알려드리겠습니다.   방금 한 일은, WPF DataGridCell에 마우스를 올리면 상위 DataGridRow의 Item의 Image를 ToolTip으로 보여주는 작업인데요, 해당 프로그램은 처음에 WinForms 어플리케이션으로 만들었다가 WPF로 컨버전하는 중이기 때문에 System.Drawing.Image를 WPF에서 사용할 수 있는 BitmapImage로 바뀌어야 만 했습니다.   해당 방법은 구글링하면 아주 손쉽게 찾을 수 있었는데, 문제는 본문에 놓친 부분이 댓글에 적혀 있었단 것을 몰랐다는 겁니다. 본문에는 아래와 같이 하라고 쓰여있었습니다. public static BitmapImage ToWpfBitmapImage(this Image image) { if (image == null) return null; var bimg = new BitmapImage(); var ms = new MemoryStream(); image.Save(ms, image.RawFormat); bimg.BeginInit(); bimg.StreamSource = ms; bimg.EndInit(); return bimg; }   네. 하지만 당연하게도 에러를 뿜어냈습니다. 에러가 안 났다면 제가 이 글을 쓰고 있지도 않았겠죠. 뭐 헤더가 손상되었을 수 있습니다  이런 에러를 뿜더라고요. 에러 원인 분석   에러가 나는 원인을 찾으려고 해당 Exception과 Message를 가지고 검색해도 잘

[C#/WPF] Preview 이벤트와 일반 이벤트

  방금 코딩을 하다가 문득 PreviewMouseDown 이벤트와 MouseDown 이벤트의 차이가 무엇일까 궁금해서 알아보고 글을 씁니다.   WPF 의 RoutedEvent 는 엘리먼트 트리의 여러 컨트롤이 이벤트에 반응할 수 있게 해주는 기능을 제공한다고 합니다. 예를 들어 아래와 같은 구조의 윈도우를 디자인했다고 생각해봅시다. 1. Window 1-1. StackPanel 1-1-1. Button   그리고 버튼을 누를 경우, 아래와 같은 순서로 이벤트가 발생한다고 하네요. PreviewMouseDown - Window   PreviewMouseDown - StackPanel PreviewMouseDown - Button MouseDown - Button MouseDown - StackPanel MouseDown - Window   이 Preview  이벤트들은 Tunneling 이라는 동작을 한다고 합니다. 그 뒤, 일반 이벤트(Preview가 붙어있지 않은 이벤트)가 역순으로 다시 발생하는 것이죠.   만약 EventArgs  매개 변수의 Handled  속성을 true 로 설정하면, 터널링과 버블링이 멈춥니다. 이런 터널링과 버블링을 라우팅 전략 이라고 한다고 하네요.   이러한 라우팅 전략은 다양한 상황에 대처할 수 있게 해준다고 합니다. 예를 들어 아래와 같은 상황이죠. 모든 StackPanel의 하위 엘리먼트들이 MouseDown 이벤트를 받지 않게 한다. ( StackPanel.PreviewMouseDown  이벤트 핸들러에서  EventArgs.Handled 를 true 로 설정하면 됩니다) 다른 어떤 컨트롤도 아닌 Window  컨트롤에서만 발생한 KeyDown  이벤트를 처리하고 싶다. ( Window.KeyDown  이벤트 핸들러에서 처리하면 됩니다)    글을 쓰기 전까지만 해도 왜 저렇게 나눠놓았는지 잘 이해가 되지 않았는데 쓰다가 보니 확실히 알겠습니다. 위 두 예제가 개인적으

[MySQL] 데이터 디렉터리를 변경하는 방법

이미지
  한 달 전, 포맷이 필요해 포맷을 하다가 실수로 MySQL 데이터를 백업하지 않아 전부 날려버린 아픈 기억이 있습니다. 사실 더 전에도 여러번 이런 적이 있는데, 그 때마다 데이터 디렉터리 변경하는 방법을 알아봐야지~ 하고서는 포맷이 끝나고 기존 어플리케이션들을 다 재설치할 때 쯤 까먹고 또 날려버리는 멍청한 짓을 반복해왔죠.   하지만 한 달 전 날린 데이터는 정말 굉장히 소중한(= 돈에 직결되는) 데이터였기에 충격이 커서 포맷 완료 후 MySQL을 재설치할 때까지 잊지 않고 데이터 디렉터리를 변경하겠다는 마음가짐을 유지할 수 있었죠.   아무튼, 이 포스트는 그런 아픈 기억에서 시작한 MySQL Data Directory를 변경하는 방법 에 대한 글입니다. MySQL Data Directory 변경하기 MySQL 서비스 중지   일단 MySQL 서비스를 중지해야 합니다. Windows 키 + R 을 눌러 실행 창을 띄운 뒤, services.msc 를 입력해 서비스 관리자를 열어주세요.   그 후, MySQL을 설치할 때 입력한 MySQL 서비스를 찾아 중지해주세요. 기본값은 MySQL[버전](예: MySQL57) 입니다. my.ini 수정하기   이제 my.ini의 datadir를 수정할 차례입니다. 마찬가지로, 시작 - 실행에 %PROGRAMDATA%\MySQL 을 입력해 폴더를 연 뒤, MySQL Server [VERSION] (예: MySQL Server 5.7) 폴더 에 들어가 my.ini 를 관리자 권한의 에디터 로 열어주세요.   그리고 스크롤을 내리다 보면, datadir 라는 프로퍼티가 보일 겁니다. (별다른 설정을 하지 않고 설치를 진행한 분의 경우 96번째 줄)   이 프로퍼티의 경로를 원하는 디렉터리로 수정해주세요. 당연히 디렉터리는 만들어져있어야 하며, 백슬래시(\) 대신 슬래시(/)를 사용하세요. MySQL 서비스 재시작   이제 거의 끝나갑니다. 1. M