2012-01-06 4 views
1

Я могу создать изображение на сервере из массива байтов, хранящегося в базе данных. Но как объединить каждый массив байтов в одно изображение. В основном я хочу складывать их поверх друг друга (все они имеют ширину 1366 пикселей и высоту 618 пикселей), а затем сохраняют это на png-изображении. Затем я получу это изображение с сервера и вернусь на веб-страницу (которую я могу сделать сейчас для одного изображения). Надеюсь, ты поможешь.Объединить изображения нескольких байтов в один

Этот код в веб-формах asp.net создает изображение, в котором я возвращаю имя файла как возврат в функцию веб-метода обратно в браузер.

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 У меня есть png как строки byte64 в базе данных, которые я конвертирую в (как показано выше в Base64ToImage(). Я бы хотел, чтобы изображения образов памяти менялись в один (накладывая друг на друга друг на друга) вместо использования физических изображений. – Rob

ответ

1

Решенный! После тонны поиска и чтения я смог объединить png-изображения в один! Каждое изображение создается из потока памяти, а затем добавляется к растровому изображению с помощью NewRectangle, который является ключом. Как только я прокручу записи из базы данных, у меня есть одно изображение, которое загружается клиенту в возврате веб-метода. Ширина и высота тянутся от клиента к веб-методу и передаются в функцию, поэтому изображение масштабируется в соответствии с внутренними размерами браузера (чтобы избежать прокрутки).

JS на стороне клиента для размеров: 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

В Если кто-то ищет что-то подобное на 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; 
     }