2012-06-11 7 views
4

이것은 불가능할 수도 있고 오히려 인기가 없을 수도 있지만 이미지 용 데이터 파일을 만드는 방법이 궁금 해서요. 총 200MB의 이미지 파일이 있다고 가정 해 봅시다. 단일 파일에 저장할 수있는 시스템이 있습니까? 150MB의 전체 크기로 압축 할 수 있습니까? (단지 예제 번호, 비율은 중요하지 않음).압축이 가능한 저장 가능 이미지 라이브러리?

이미지를 Base64으로 인코딩 한 다음 SQLite 데이터베이스에 저장할 수 있다는 것을 알고 있지만 인코딩 된 형식으로 이미지를 저장하면 원본 이미지 파일 자체보다 약간 큰 크기가됩니다.

나는 또한 ZIP 파일을 생각하고 있었지만 그 파일을 '라이브러리'로 사용할 수 있는지 확실하지 않았습니다.

이와 같은 것이 미리 정의 된 클래스로 존재하지 않으면 누군가 나를 올바른 방향으로 인도 할 수 있습니까? 나는 이것이 가능 희망

class ImageLibrary { 
    //this is where the code would go for the library? 
} 

class MyProgram{ 
    public MyProgram() 
    { 
    ImageLibrary library = new ImageLibrary(); 
    library.Add(<Image object here, with an ID of sorts>); 
    library.Add(<Another image object here, also with an ID>); 
    Load += new FormLoadEventHandler(MyProgram_Load); 
    } 

    void MyProgram_Load(object sender, EventArgs e) 
    { 
    PictureBox.Image = library.Get(<image id here>); 
    } 
} 

:

내가 종류의 무엇을 찾고 있어요의 실물 크기의 모형이다. 그렇지 않으면, 나는 약간 더 큰 파일 크기와 함께 Base64을 인코딩 할 것입니다. 그러나, 내가 지금 저장하고 싶은 약 500 개의 이미지가 있기 때문에 절약 된 kB는 벌린 KB입니다. :) 또한, 제 코드 예제의 품질을 판단하지 마십시오. 단지 모의예요. 나는 그것을 커프에서 썼습니다.

환호, 그리고 고맙습니다. 이 문서 밖으로

+0

base64는 약 1.33 배가되지만 SQLite는 BLOB를 지원하므로 인코딩이 필요하지 않습니다. – Thomas

+0

@ 토마스 알아두면 좋을지 모르겠다. 그래서, 적어도 그것이 이미지와 같은 크기가 될 것이고, 데이터베이스에 저장된 추가 세부 사항 때문에 각 이미지에 약 kb를 더한 것입니다. 저장되기 전에 이러한 이미지를 압축 할 수있는 방법이 있습니까? –

+1

@Spiritfire : 일반적으로 최적화 된 jpg/png 등을 압축하면 크기가 줄어들지 않습니다 (때로는 증가합니다!). 저장하기 전에 최적화되어 있는지 확인하십시오. –

답변

3

바이너리 파일이 내가 바이너리로 변환하고 SQLite는에 저장하는 데 사용하는 코드입니다 도움이 될 것으로 이미지를 저장하는 경우 :

void SaveImage(byte[] image){ 
     string conStringDatosUsuarios = @" Data Source = \Program Files\GPS___CAM\Data\DatosUsuarios.s3db ";    
     SQLiteConnection con = new SQLiteConnection(conStringDatosUsuarios); 
     SQLiteCommand cmd = con.CreateCommand(); 
     cmd.CommandText = String.Format("INSERT INTO Users (Foto) VALUES (@0);"); 
     SQLiteParameter p = new SQLiteParameter("@0", System.Data.DbType.Binary); 
     p.Value = image; 
     cmd.Parameters.Add(p);    
     con.Open(); 
     try 
     { 
      cmd.ExecuteNonQuery(); 
     } 
     catch (Exception exc1) 
     { 
      MessageBox.Show(exc1.Message); 
     } 
     con.Close(); 
    } 
: 바이너리를 저장 한 후

public byte[] ImageToByte(Image image, System.Drawing.Imaging.ImageFormat format){ 
     using (MemoryStream ms = new MemoryStream()) 
     { 
      // Convert Image to byte[] 
      image.Save(ms, format); 
      byte[] imageBytes = ms.ToArray(); 
      return imageBytes; 
     } 
    } 
    public Image ByteToImage(byte[] imageBytes) 
    { 
     // Convert byte[] to Image 
     MemoryStream ms = new MemoryStream(imageBytes, 0, imageBytes.Length); 
     ms.Write(imageBytes, 0, imageBytes.Length); 
     Image image = new Bitmap(ms); 
     return image; 
    } 

을 그리고 IMAG 할 바이트를 변환 (:

당신이 물었다, 나는 부하 이미지 코드를 통해 업데이트

편집 희망이 도움이

System.Type checkType = rdr[0].GetType(); 
pictureBox1.Image = ByteToImage((System.Byte[])rdr[0]); 

코드에서 첫 번째 줄을 추가하고 넣어 : 전자 당신은

void LoadImage(string tag){ 
     string query = "SELECT Foto FROM Users;"; 
     string conString = @" conection to your database "; 
     SQLiteConnection con = new SQLiteConnection(conString); 
     SQLiteCommand cmd = new SQLiteCommand(query, con);    
     con.Open(); 
     try 
     { 
      SQLiteDataReader rdr = cmd.ExecuteReader(); 
      try 
      { 
       while (rdr.Read()) 
       { 
        pictureBox1.Image = ByteToImage((System.Byte[])rdr[0]); 
       } 
      } 
      catch (Exception exc) { MessageBox.Show(exc.Message); } 
     } 
     catch (Exception ex) { MessageBox.Show(ex.Message); } 
     con.Close(); 
    } 

편집 2 데이터의 유형은 당신이 부하에 노력하고있다 보려면이 시도)를 ByteToImage 함수를 사용해야합니다 그 줄의 중단 점. checkType의 유형을 확인하십시오. 아마도 바이너리가 아닙니다. 당신을 도울 결과를 알려주십시오.

+0

이것은 유망 할 수 있습니다. 파일 크기에 어떤 영향을 미치는지 알고 있습니까? 예 : 작고 크고 평등 한가? –

+0

@ Spiritfyre이 코드를 사용하여 내 이미지를 내 db에 저장하고 크기가 원본과 동일합니다. 나는 base64로 그들을 저장하기 위해 프로브하지만 큰 파일로 바뀝니다. 지금까지 이것이 내 이미지를 저장하기 위해 얻을 수있는 최선의 방법입니다. –

+0

훌륭함, 저는 이것을 사용하고 있으며 멋지게 작동합니다. 슬프게도 이미지 압축은 없지만 적어도 찾고 있던 것의 90 %입니다. 추가 된 보너스는'SQLite' 데이터베이스에 있으며, 작업이 매우 간단합니다. 고마워요 :) –

1

확인 : http://msdn.microsoft.com/en-us/library/aa479502.aspx

나는 그것이 도움이되기를 바랍니다. ZIP에서 파일에 액세스하기위한 아이디어. 바로 사용할 수있는 솔루션이 아니라 멋진 개념 설명입니다.

+0

이것은 조사할만한 가치가있는 것처럼 보입니다.하지만 너무 깊게 파고 들기 전에 색인을 지원하는지 알고 있습니까? 마찬가지로 각 파일에 문자열을 넣어 색인을 생성하는 것처럼 데이터베이스와 비슷합니까? –