티스토리 뷰
비주얼 스튜디오 버전 16.11.7
대상 프레임 워크 .NET Core 3.1
오라클 11g 기준으로 작성된 글입니다.
DB 연결은 아래 글을 참고하시면 됩니다.
Blob 형식으로 이미지 저장
적절한 쿼리문으로 바꾸어 사용하시면 됩니다.
// 이미지 경로를 받아 이진 형식으로 파일을 읽어 반환하는 함수
public byte[] ReadFile(string sPath)
{
byte[] data = null;
FileInfo fInfo = new FileInfo(sPath);
long numBytes = fInfo.Length;
FileStream fStream = new FileStream(sPath, FileMode.Open, FileAccess.Read);
BinaryReader br = new BinaryReader(fStream);
data = br.ReadBytes((int)numBytes);
return data;
}
// 이미지경로를 받아 blob형으로 변환된 이미지 insert
internal void insert_blob(string img_path)
{
try
{
Initialize();
App.conn.Open();
// 이미지를 바이트형 식으로 읽어온다.
byte[] blob = ReadFile(img_path);
// 쿼리문 세팅 (아래는 예시)
string qry = "insert into 테스트 values ('1', :BlobParameter)";
// 파라미터 세팅
OracleParameter blobParameter = new OracleParameter();
blobParameter.OracleDbType = OracleDbType.Blob;
blobParameter.ParameterName = "BlobParameter";
blobParameter.Value = blob;
// 명령 실행 객체 생성
OracleCommand cmd = new OracleCommand(qry, App.conn);
// 파라미터 삽입
cmd.Parameters.Add(blobParameter);
//쿼리문 실행
cmd.ExecuteNonQuery();
cmd.Dispose();
App.conn.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
저는 OpenFileDialog를 이용해 사용자가 이미지 파일을 선택할 수 있도록 하고,
FileName으로 경로를 추출해 함수를 호출해 사용하였습니다.
OpenFileDialog openFileDialog;
...
insert_blob(openFileDialog.FileName);
Blob 형식으로 이미지 저장된 이미지 가져오기
번호를 받아 select 문으로 blob 데이터를 받아오고 비트맵 소스로 반환하는 함수입니다.
// DB에서 이미지를 가져와 비트맵 Source 형식으로 반환
public BitmapImage GetImagesFromDatabase(string num)
{
try
{
Initialize();
App.conn.Open();
OracleDataAdapter oda = new OracleDataAdapter("select 이미지 from 테스트 where 번호 = '" + num + "'", App.conn);
DataSet DS = new DataSet();
oda.Fill(DS);
DataTable dt = DS.Tables[0];
DataRow row = dt.Rows[0];
//이미지가 로드 되지 않는다면 null 반환
if (row[0].ToString() == "")
{
App.conn.Close();
return null;
}
else
{
byte[] blob = (byte[])row[0];
MemoryStream stream = new MemoryStream();
stream.Write(blob, 0, blob.Length);
stream.Position = 0;
System.Drawing.Image img = System.Drawing.Image.FromStream(stream);
BitmapImage bi = new BitmapImage();
bi.BeginInit();
MemoryStream ms = new MemoryStream();
img.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
ms.Seek(0, SeekOrigin.Begin);
bi.StreamSource = ms;
bi.EndInit();
App.conn.Close();
return bi;
}
}
catch (Exception err)
{
MessageBox.Show(err.ToString());
App.conn.Close();
return null;
}
}
다음과 같은 Border 컴포넌트가 있을 때 ImageSource로 사용할 수 있습니다.
WPF특성상 컴포넌트 안에 컴포넌트를 배치하거나새롭게 정의할 수 있기 때문에
Border에 넣는 방법만 알아도 활용도가 무궁무진할 것입니다.
<Border Grid.Row="1" Grid.Column="1" Padding="10" Margin="45,55,60,55" CornerRadius="20">
<Border.Background>
<ImageBrush x:Name="poster" ImageSource="이미지경로" Stretch ="UniformToFill"/>
</Border.Background>
</Border>
poster.ImageSource = GetImagesFromDatabase(num);
감사합니다.
공부한 내용을 복습/기록하기 위해 작성한 글이므로 내용에 오류가 있을 수 있습니다.
'C# | WPF' 카테고리의 다른 글
[WPF] 입문하기 - WPF란 (0) | 2021.12.23 |
---|---|
[WPF/C#, XAML] 버튼 배경색 바꾸기 (0) | 2021.12.23 |
[WPF/XAML] 둥근 테두리 버튼 만들기 (0) | 2021.12.23 |
[WPF/C#/Oracle DB] 오라클 DB 연결하기 (0) | 2021.12.23 |
댓글