none
如何將用直接畫出來的圖片存入SQL RRS feed

  • 問題

  • 各位先進大家好:

    我用下面這段程式來產生Barcode

    Code Snippet

    using System.Drawing;
    using System.Drawing.Imaging;

    private Bitmap GetCode39(string strSource)
    {
      int x = 5; //左邊界
      int y = 0; //上邊界
      int WidLength = 2; //粗BarCode長度
      int NarrowLength = 1; //細BarCode長度
      int BarCodeHeight = 24; //BarCode高度
      int intSourceLength = strSource.Length;
      string strEncode = "010010100"; //編碼字串 初值為 起始符號 *
     
      string AlphaBet = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%*"; //Code39的字母
     
      string[] Code39 = //Code39的各字母對應碼
      {
           /**//* 0 */ "000110100",
           /**//* 1 */ "100100001",
           /**//* 2 */ "001100001",
           /**//* 3 */ "101100000",
           /**//* 4 */ "000110001",
           /**//* 5 */ "100110000",
           /**//* 6 */ "001110000",
           /**//* 7 */ "000100101",
           /**//* 8 */ "100100100",
           /**//* 9 */ "001100100",
           /**//* A */ "100001001",
           /**//* B */ "001001001",
           /**//* C */ "101001000",
           /**//* D */ "000011001",
           /**//* E */ "100011000",
           /**//* F */ "001011000",
           /**//* G */ "000001101",
           /**//* H */ "100001100",
           /**//* I */ "001001100",
           /**//* J */ "000011100",
           /**//* K */ "100000011",
           /**//* L */ "001000011",
           /**//* M */ "101000010",
           /**//* N */ "000010011",
           /**//* O */ "100010010",
           /**//* P */ "001010010",
           /**//* Q */ "000000111",
           /**//* R */ "100000110",
           /**//* S */ "001000110",
           /**//* T */ "000010110",
           /**//* U */ "110000001",
           /**//* V */ "011000001",
           /**//* W */ "111000000",
           /**//* X */ "010010001",
           /**//* Y */ "110010000",
           /**//* Z */ "011010000",
           /**//* - */ "010000101",
           /**//* . */ "110000100",
           /**//*' '*/ "011000100",
           /**//* $ */ "010101000",
           /**//* / */ "010100010",
           /**//* + */ "010001010",
           /**//* % */ "000101010",
           /**//* * */ "010010100"
      };
     
     
      strSource = strSource.ToUpper();
     
      //實作圖片
      Bitmap objBitmap = new Bitmap(
        ((WidLength * 3 + NarrowLength * 7) * (intSourceLength + 2)) + (x * 2),
        BarCodeHeight + (y * 2));
     
      Graphics objGraphics = Graphics.FromImage(objBitmap); //宣告GDI+繪圖介面
     
      //填上底色
      objGraphics.FillRectangle(Brushes.White, 0, 0, objBitmap.Width, objBitmap.Height);
     
      for (int i = 0; i < intSourceLength; i++)
      {
        //檢查是否有非法字元
        if (AlphaBet.IndexOf(strSource[i]) == -1 || strSource[i] == '*')
        {
          objGraphics.DrawString("含有非法字元",
            SystemFonts.DefaultFont, Brushes.Red, x, y);
          return objBitmap;
        }
        //查表編碼
        strEncode = string.Format("{0}0{1}", strEncode,
         Code39[AlphaBet.IndexOf(strSource[i])]);
      }
     
      strEncode = string.Format("{0}0010010100", strEncode); //補上結束符號 *
     
      int intEncodeLength = strEncode.Length; //編碼後長度
      int intBarWidth;
     
      for (int i = 0; i < intEncodeLength; i++) //依碼畫出Code39 BarCode
      {
        intBarWidth = strEncode[i] == '1' ? WidLength : NarrowLength;
        objGraphics.FillRectangle(i % 2 == 0 ? Brushes.Black : Brushes.White,
          x, y, intBarWidth , BarCodeHeight);
        x += intBarWidth;
      }
      return objBitmap;
    }

     

    想請教如何將此種方式產生的Bitmap存入到SQL 2005的image欄位?再用crystal report產生報表?

    謝謝!

    2009年1月1日 上午 05:49

解答

所有回覆

  • HI,

     

    假設bitmap是Bitmap類別的物件, 可以先利用下列的程式碼轉換成byte陣列:

     

    MemoryStream ms = new MemoryStream();
    bitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
    int sigLength = (int)ms.Length;
    byte[] bytes = new byte[sigLength];
    ms.Seek(0, SeekOrigin.Begin);
    for (int i = 0; i < sigLength; i++)
    {
    int b = ms.ReadByte();
    if (b == -1)
    break;
    bytesIdea = Convert.ToByte(b);
    }
    ms.Close();

     

    就可以將byte陣列直接寫入到SQL SERVER資料庫中image型態的欄位

     

    tihs

    2009年1月1日 下午 12:40
  • 你去下載條碼字型來用還比較快...

     

    2009年1月1日 下午 05:20
  • 感謝各位先進提供的建議,我會試看看!謝謝!

     

    2009年1月2日 上午 01:12
  • 各位先進大家好:

    我用上述提供的方式已經可以將圖片儲存在SQL!

    我現在想用Crystal Report 將該資料庫中資料型別為image之資料以圖片方式產生報表,而我產生報表的方式是用Dataset

    ,若沒有image資料時產生報表的程式碼如下即可

            Dim Rpt1 As New CrystalDecisions.CrystalReports.Engine.ReportDocument
            Rpt1.Load(Server.MapPath("..\PrgA0Rpt\rpt\crPrint.rpt"))
            Dim ds1 As DataSet
            Dim sql As String

            ds1 = New dsaaa

            sql = "Select imagedata,imgname  from aaa"     'imagedata為圖片欄位
            Dim cmd1 As New SqlDataAdapter(sql, conn)
            cmd1.Fill(ds1, "aaa")

            Rpt1.SetDataSource(ds1)
            crv1.ReportSource = Rpt1

    可是這樣報表無法顯示出圖片,所以上網查了許多資料,知道好像需要將原先ds1中image資料轉成二進位資料再更新ds1

    ,可是試了很久都試不出來,能否請各位先進指導一下,謝謝!

    2009年1月2日 上午 08:05