webForumDet fria alternativet

Drawline/drawcirlce på bilder från SQL

.NETur .NET

6 svar · 421 visningar · startad av MrJansson

Medlem sedan apr. 20073 inlägg
Frågan#1

Hej!

Jag behöver få hjälp med att manipulera bilder som ligger i min SQL-server innan jag publicerar dom. Just nu refererar jag till en aspx-sida

ImageMap1.ImageUrl = "~/relationsbat/displayimage.aspx?id_images=1"

Vad jag vill göra är att på den bild som displayimage.aspx producerar rita diverse linjer och cirklar på genom att använda t.ex. drawline/drawellipse.

Drawline/ellipse på en egen skapad bild i kod är enkelt men hur i h-e gör jag ovanstående? :)

En platta bärs eller en whisky till den som löser problemet innan måndag kväll 23 april-07.

/Stefan

Medlem sedan maj 20012 812 inlägg
#2

Om du har bilden lagrad i din databas som en binary så måste du ju skapa en bild innan du kan skicka den till din websidor. Då har du ju skapat din bild som du kan manipulera.

Om du inte har bilderna i databasen utan endast länken till bilden, så får du använda Image objektet och LoadFromFile metoden för att skapa bilden, sen så kan du enkelt manipulera bilden.

- M

Medlem sedan sep. 200278 inlägg
#3

Filen displayimage.aspx innehåller rimiligtvis kod för att hämta bilden från databasen och rendera den till klienten. Titta i koden för den sidan vad som händer.

Du bör ha ett image- eller bitmapobjekt som du kan skapa en Graphics-referens från och då kan du rita vad du vill på den ;)

Googla lite på t ex GDI+ eller så, så hittar du mer information om hur Graphics funkar.

Medlem sedan apr. 20073 inlägg
#4

Så har ser filen displayimage.aspx ut...

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    Dim id_images As String = Request.QueryString("id_images")
    Dim size As String = Request.QueryString("size")
    Dim objCn As New System.Data.SqlClient.SqlConnection

    Dim objCmd As New System.Data.SqlClient.SqlCommand

    objCn.ConnectionString = "Data Source=(local);Initial Catalog=events;user=xx;password=xxx;"

    objCmd.Connection = objCn

    Dim strSQL = "SELECT \* FROM images WHERE id_images = '" & id_images & "'"

    objCmd.CommandText = strSQL

    Dim objAdapter As New System.Data.SqlClient.SqlDataAdapter

    Dim objDs As New System.Data.DataSet

    Dim objDataRow As System.Data.DataRow

    objAdapter.SelectCommand = objCmd

    objAdapter.Fill(objDs, "images")

    objDataRow = objDs.Tables("images").Rows(0)

    Response.ContentType = objDataRow.Item("LG_img_contenttype")
    If size = "thumb" Then
        Response.BinaryWrite(objDataRow.Item("SM_img_data"))
    Else
        Response.BinaryWrite(objDataRow.Item("LG_img_data"))

    End If

    objCn.Close()

End Sub
Medlem sedan sep. 200278 inlägg
#5

Man kan väl anta att fälten SM_img_data och LG_img_data innehåller ett gäng med bytes som du kan ladda in i ett Bitmapobjekt med hjälp av en ström... Testa läsa in fälten till en byte[], läs in arrayen till en MemoryStream som du sen skapar en Image av med Image.FromStream(memoryStream).

Nåt åt det hållet ;)

Medlem sedan apr. 20073 inlägg
#6

ordell skrev:

Man kan väl anta att fälten SM_img_data och LG_img_data innehåller ett gäng med bytes som du kan ladda in i ett Bitmapobjekt med hjälp av en ström... Testa läsa in fälten till en byte[], läs in arrayen till en MemoryStream som du sen skapar en Image av med Image.FromStream(memoryStream).

Nåt åt det hållet ;)

Kanon!

Det fungerade som du sa, du är en klippa!

Här är resultatet om andra vill använda.

     Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
       Dim id_images As String = Request.QueryString("id_images")
        Dim size As String = Request.QueryString("size")
        Dim marker As String = Request.QueryString("marker")
        Dim objCn As New System.Data.SqlClient.SqlConnection

        Dim objCmd As New System.Data.SqlClient.SqlCommand

        objCn.ConnectionString = "Data Source=(local);Initial Catalog=events;user=sa;password=L3ksand06AS;"

        objCmd.Connection = objCn

        Dim strSQL = "SELECT * FROM images WHERE id_images = '" & id_images & "'"

        objCmd.CommandText = strSQL

        Dim objAdapter As New System.Data.SqlClient.SqlDataAdapter

        Dim objDs As New System.Data.DataSet

        Dim objDataRow As System.Data.DataRow

        objAdapter.SelectCommand = objCmd

        objAdapter.Fill(objDs, "images")

        objDataRow = objDs.Tables("images").Rows(0)

        Response.ContentType = objDataRow.Item("LG_img_contenttype")
        objCn.Close()
        Dim objBitmap As Bitmap

        Dim objGraphics As Graphics
        If size = "thumb" Then
            Dim bytImageData() As Byte = objDataRow.Item("SM_img_data")
            Dim stmImageData As New MemoryStream(bytImageData)
            objBitmap = New Bitmap(stmImageData)
        Else
            Dim bytImageData() As Byte = objDataRow.Item("LG_img_data")
            Dim stmImageData As New MemoryStream(bytImageData)
            objBitmap = New Bitmap(stmImageData)
        End If

        objGraphics = Graphics.FromImage(objBitmap)

        objGraphics.DrawRectangle(New Pen(Color.Red, 4), x, y, width, height)
        objGraphics.DrawLine(New Pen(Color.Red, 2), x1, y1, x2, y2)
        objGraphics.DrawEllipse(New Pen(Color.Red, 2), New System.Drawing.Rectangle(x, y, width, height)))
 
        objBitmap.Save(Response.OutputStream, ImageFormat.Gif)

        objBitmap.Dispose()
        objGraphics.Dispose()
    End Sub
Medlem sedan okt. 20041 556 inlägg
#7

MrJansson [code ]-taggar om man får be... :)

136 ms totalt · 3 externa anrop · v20260731065814-full.b746b907
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
133 ms — hämta tråd, inlägg och bilagor (db)