티스토리 뷰

 

비주얼 스튜디오 버전 16.11.7

대상 프레임 워크 .NET Core 3.1

오라클 11g 기준으로 작성된 글입니다.

 

 

 

 

DB 연결은 아래 글을 참고하시면 됩니다.

 

 

[WPF/C#] 오라클 DB 연결하기

비주얼 스튜디오 버전 16.11.7 대상 프레임 워크 .NET Core 3.1 오라클 11g 기준으로 작성된 글 입니다. [ Oracle.ManagedDataAccess.Core 설치하기 ] WPF에서 오라클 DB 데이터를 사용하기 위해서는 먼저 패키지..

munak.tistory.com

 

 


 

 

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);

 

 

감사합니다.

 


 

공부한 내용을 복습/기록하기 위해 작성한 글이므로 내용에 오류가 있을 수 있습니다.

 

댓글
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Total
Today
Yesterday