2012-01-06 18 views
1

データベースに格納されたバイト配列からサーバー上にイメージを作成できます。しかし、どのようにして各バイト配列を1つのイメージに結合しますか?基本的には、それらを重ねて(幅は1366px、高さは618pxです)、重ねてpng画像に保存します。私はそのイメージをサーバーから取得し、Webページに戻します(私は今、1つのイメージでこれを行うことができます)。あなたが手伝ってくれることを願います。複数のバイト配列イメージを1つにまとめる

このコードはasp.net webフォームで、Webmethod関数の戻り値としてファイル名をブラウザに返すイメージを作成します。

Public Shared Function Base64ToImage(ByVal base64String As String, ByVal id As String) As String 
     'http://www.dailycoding.com/Posts/convert_image_to_base64_string_and_base64_string_to_image.aspx 
     ' Convert Base64 String to byte[] 

     Dim sFileName As String = String.Empty 

     Try 
      Dim imageBytes As Byte() = Convert.FromBase64String(base64String) 
      Dim ms As New MemoryStream(imageBytes, 0, imageBytes.Length) 

      ' Convert byte[] to Image 
      ms.Write(imageBytes, 0, imageBytes.Length) 
      Dim image__1 As Image = Image.FromStream(ms, True) 

      sFileName = "img_" & id & ".png" 

      Dim sPath As String = HttpContext.Current.Server.MapPath("images\") 

      image__1.Save(sPath & sFileName, System.Drawing.Imaging.ImageFormat.Png) 
     Catch ex As Exception 

     End Try 

     ' 
     Return sFileName 
    End Function 

私は、レコードをループし、その後sourcecopyと組み合わせるしようとしているが、私はそれがそれらを結合するために得ることができない、これを試してみましたか?

Public Shared Function Base64ToImage2(ByVal dt As DataTable) As String 

     ' Convert Base64 String to byte[] 

     Dim sFileName As String = String.Empty 
     Dim base64String As String, id As String 

     'if first record create image 
     'on 2nd or greater in dt then combine images 
     Try 

      Dim iCount As Integer = 0 
      Dim image__1 As Image = Nothing 
      Dim compositeImage As Image = Nothing 
      Dim sPath As String = String.Empty 

      If dt.Rows.Count > 0 Then 
       For Each myRow As DataRow In dt.Rows 
        'getImage = getImage() & Base64ToImage(myRow("image_data").ToString(), myRow("id").ToString()) & "|" 

        If iCount = 0 Then 

         Dim imageBytes As Byte() = Convert.FromBase64String(myRow("image_data").ToString()) 
         Dim ms As New MemoryStream(imageBytes, 0, imageBytes.Length) 

         ' Convert byte[] to Image 
         ms.Write(imageBytes, 0, imageBytes.Length) 
         image__1 = System.Drawing.Image.FromStream(ms) 

         'sFileName = "img_1.png" 
         'sPath = HttpContext.Current.Server.MapPath("images\") 
         'image__1.Save(sPath & sFileName, System.Drawing.Imaging.ImageFormat.Png) 

         'compositeImage = New Bitmap(image__1.Width, image__1.Height) 

        Else 

         Dim imageBytes As Byte() = Convert.FromBase64String(myRow("image_data").ToString()) 
         Dim ms2 As New MemoryStream(imageBytes, 0, imageBytes.Length) 

         ' Convert byte[] to Image 
         ms2.Write(imageBytes, 0, imageBytes.Length) 
         Dim image__2 As Image = System.Drawing.Image.FromStream(ms2) 

         Dim g As Graphics = Graphics.FromImage(image__1) 
         g.CompositingMode = CompositingMode.SourceCopy 

         g.DrawImage(image__2, 0, image__1.Height) 

         sFileName = "img_1.png" 
         'sPath = HttpContext.Current.Server.MapPath("images\") 
         'image__2.Save(sPath & sFileName, System.Drawing.Imaging.ImageFormat.Png) 

        End If 
        iCount = iCount + 1 
       Next myRow 
      End If 

      'sFileName = "img_1.png" 
      'Dim sPath As String = HttpContext.Current.Server.MapPath("images\") 
      'compositeImage.Save(sPath & sFileName, System.Drawing.Imaging.ImageFormat.Png) 

     Catch ex As Exception 

     End Try 

     ' 
     Return sFileName 
    End Function 
+0

Li st adatapost

+1

これはあなたが探しているものですhttp://stackoverflow.com/questions/465172/merging-two-images-in-c-net –

+0

@Shoaib私は、データベースに変換するバイト64文字列としてpngを持っています(前述のBase64ToImage()のように)。私は、物理的な画像を使用する代わりに、メモリストリームの '画像'を一つに(それぞれの上に重ね合わせて)重ね合わせたいと思います。 – Rob

答えて

1

解決済み! 1トンの検索と読書の後、私はpngイメージを1つにまとめることができました!各イメージはメモリストリームから作成され、キーであるNewRectangleでビットマップに追加されます。データベースからレコードをループすると、webmethodリターンでクライアントにダウンロードされるイメージが1つあります。幅と高さはクライアントからWebメソッドに引き出され、関数に渡されるので、画像はブラウザの内寸に合わせてスケーリングされます(スクロールバーを避けるため)。 mywidth = window.innerWidth myheight = window.innerHeight

BASE64バイト画像は、以下のように変換するコード...

Public Shared Function Base64ToImage2(ByVal dt As DataTable, ByVal Image_Width As String, ByVal Image_Height As String) As String 

     Dim sFileName As String = String.Empty 
     Dim sPath As String = HttpContext.Current.Server.MapPath("images\") 
     Dim myimage As Image = Nothing 

     ' Create a new bitmap object 400 pixels wide by 60 pixels high 
     Dim objBitmap As New Bitmap(CInt(Image_Width), CInt(Image_Height)) 

     '' Create a graphics object from the bitmap 
     Dim objGraphic As Graphics = Graphics.FromImage(objBitmap) 

     'if first record create image 
     'on 2nd or greater in dt then combine images 
     Try  

      If dt.Rows.Count > 0 Then 
       For Each myRow As DataRow In dt.Rows 


        Dim imageBytes As Byte() = Convert.FromBase64String(myRow("image_data").ToString()) 
        Dim ms As New MemoryStream(imageBytes, 0, imageBytes.Length) 

        ' Convert byte[] to Image 
        ms.Write(imageBytes, 0, imageBytes.Length) 
        myimage = System.Drawing.Image.FromStream(ms) 

        objGraphic.DrawImage(myimage, New Rectangle(0, 0, CInt(Image_Width), CInt(Image_Height))) 

       Next myRow 

       sFileName = "img_1.png" 
       objBitmap.Save(sPath & sFileName, System.Drawing.Imaging.ImageFormat.Png) 

      End If 



     Catch ex As Exception 

     End Try 

     ' 
     Return sFileName 
    End Function 
0

において:ディメンションのクライアントに

JS他の人がC#で似たようなものを探していますが、ここではコードを使って画像ソースをロードしようとしています。

 private void LoadImage() 
     { 
      string src = string.empty; 
      byte[] mergedImageData = new byte[0]; 

      mergedImageData = MergeTwoImageByteArrays(watermarkByteArray, backgroundImageByteArray); 
      src = "data:image/png;base64," + Convert.ToBase64String(mergedImageData); 
      MyImage.ImageUrl = src; 
     } 

     private byte[] MergeTwoImageByteArrays(byte[] imageBytes, byte[] imageBaseBytes) 
     { 
      byte[] mergedImageData = new byte[0]; 
      using (var msBase = new MemoryStream(imageBaseBytes)) 
      { 
       System.Drawing.Image imgBase = System.Drawing.Image.FromStream(msBase); 
       Graphics gBase = Graphics.FromImage(imgBase); 
       using (var msInfo = new MemoryStream(imageBytes)) 
       { 
        System.Drawing.Image imgInfo = System.Drawing.Image.FromStream(msInfo); 
        Graphics gInfo = Graphics.FromImage(imgInfo); 
        gBase.DrawImage(imgInfo, new Point(0, 0)); 
        //imgBase.Save(Server.MapPath("_____testImg.png"), ImageFormat.Png); 
        MemoryStream mergedImageStream = new MemoryStream(); 
        imgBase.Save(mergedImageStream, ImageFormat.Png); 
        mergedImageData = mergedImageStream.ToArray(); 
        mergedImageStream.Close(); 
       } 
      } 
      return mergedImageData; 
     } 
関連する問題