Avatar billede tjgrindsted Nybegynder
25. marts 2007 - 23:19 Der er 21 kommentarer og
1 løsning

Får ikke vist et Captcha billede.

Hej

Kan nogle forklare mig hvad der sker her http://www.kennelenggaard.dk/captcha.aspx jeg får ikke vist et billede.

lidt af min kode fra Default.aspx er:
<img src="TuringImage.aspx" alt="" />

Min kode på TuringImages.aspx er dette:
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="TuringImage.aspx.vb" Inherits="TuringImage" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>TurningImage</title>
</head>
<body>
</body>
</html>

Min code_behind for denne side er så:
Imports System.IO
Imports System.Collections
Imports System.ComponentModel
Imports System.Data
Imports System.Drawing
Imports System.Drawing.Drawing2D
Imports System.Drawing.Imaging
Imports System.Web
Imports System.Web.SessionState
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports System.Web.UI.HtmlControls

Partial
Class TuringImage
Inherits System.Web.UI.Page
Private random As Random = New Random
Private Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
'Width and height of image
Dim width As Integer = 200
Dim height As Integer = 50
Dim familyName As String = "Times New Roman"
'String imageText = "123456";
Dim imageText As String = Me.Session("TuringImageText").ToString
'Create a new 32-bit bitmap image.
Dim bitmap As System.Drawing.Image = New Bitmap(width, height, PixelFormat.Format32bppArgb)
'Create a graphics object for drawing.
Dim g As Graphics = Graphics.FromImage(bitmap)
g.SmoothingMode = SmoothingMode.AntiAlias
Dim rect As Rectangle = New Rectangle(0, 0, width, height)
'Fill in the background.
Dim hatchBrush As HatchBrush = New HatchBrush(HatchStyle.SmallConfetti, Color.LightGray, Color.White)
g.FillRectangle(hatchBrush, rect)
'Set up the text font.
Dim size As SizeF
Dim fontSize As Single = rect.Height + 1
Dim font As Font
'Adjust the font size until the text fits within the image.
Do
System.Math.Max(System.Threading.Interlocked.Decrement(CLng(fontSize)), fontSize + 1)
font = New Font(familyName, fontSize, FontStyle.Bold)
size = g.MeasureString(imageText, font)
Loop While size.Width > rect.Width
'Set up the text format.
Dim format As StringFormat = New StringFormat
format.Alignment = StringAlignment.Center
format.LineAlignment = StringAlignment.Center
'Create a path using the text and warp it randomly.
Dim path As GraphicsPath = New GraphicsPath
path.AddString(imageText, font.FontFamily, CType(font.Style, Integer), font.Size, rect, format)
Dim v As Single = 4.0F
Dim points As PointF() = {New PointF(Me.random.Next(rect.Width) / v, Me.random.Next(rect.Height) / v), New PointF(rect.Width - Me.random.Next(rect.Width) / v, Me.random.Next(rect.Height) / v), New PointF(Me.random.Next(rect.Width) / v, rect.Height - Me.random.Next(rect.Height) / v), New PointF(rect.Width - Me.random.Next(rect.Width) / v, rect.Height - Me.random.Nex(rect.Height) / v)}
Dim matrix As Matrix = New Matrix
matrix.Translate(0.0F, 0.0F)
path.Warp(points, rect, matrix, WarpMode.Perspective, 0.0F)
'Draw the text.
hatchBrush = New HatchBrush(HatchStyle.LargeConfetti, Color.LightGray, Color.DarkGray)
g.FillPath(hatchBrush, path)
'Add some random noise.
Dim m As Integer = Math.Max(rect.Width, rect.Height)
Dim i As Integer = 0
While i < CType((rect.Width * rect.Height / 30.0F), Integer)
Dim x As Integer = Me.random.Next(rect.Width)
Dim y As Integer = Me.random.Next(rect.Height)
Dim w As Integer = Me.random.Next(m / 50)
Dim h As Integer = Me.random.Next(m / 50)
g.FillEllipse(hatchBrush, x, y, w, h)
System.Math.Min(System.Threading.Interlocked.Increment(i), i - 1)
End While
'Change the response headers to output a JPEG image.
Me.Response.Clear()
Me.Response.ContentType = "image/jpeg"
bitmap.Save(Me.Response.OutputStream, ImageFormat.Jpeg)
'Clean up.
'font.Dispose();
hatchBrush.Dispose()
g.Dispose()
End Sub
End Class
Avatar billede thesurfer Nybegynder
26. marts 2007 - 09:26 #1
Der må være et eller andet fuldstændig galt med din TuringImages.aspx...

TuringImages.aspx skal returnere billedet, enten i form af binære data eller en redirect, højst sandsynligt System.Execute eller tilsvarende..
Avatar billede thesurfer Nybegynder
26. marts 2007 - 09:27 #2
Med andre ord: Der skal ikke være (X)HTML i filen TuringImages.aspx, men kun ASP.NET.
Avatar billede tjgrindsted Nybegynder
26. marts 2007 - 14:58 #3
ja du siger noget...har slettet alt i TuringImages.aspx og har kun linjen til min code_behind altså <%@ Page Language="VB" AutoEventWireup="false" CodeFile="TuringImage.aspx.vb" Inherits="TuringImage" %>

men den viser stadigvæk billede fejlen..
Avatar billede thesurfer Nybegynder
26. marts 2007 - 22:40 #4
Uhm.. hvad skulle denne linie gøre..?:

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="TuringImage.aspx.vb" Inherits="TuringImage" %>

Så vidt jeg har forstået, skal filen TuringImages.aspx generere billedet, eller omdigirere til billedet.. det gør den ikke med den linie..

Der skal være en forbindelse mellem filen og klassen "TuringImage"..
Klassen indeholder nemlig den kode, der genererer billedet, og afsluttes bl.a. med:

Me.Response.Clear()
Me.Response.ContentType = "image/jpeg"
bitmap.Save(Me.Response.OutputStream, ImageFormat.Jpeg)

Her sættes Response, som "udskriver" billedet, som så vises via IMG-tag'et..

Jeg ved ikke hvor du har fået koden fra, men der må stå noget om hvordan man bruge scriptet..
Avatar billede tjgrindsted Nybegynder
26. marts 2007 - 23:37 #5
Hej TheSurfer

Jeg har koden fra http://www.mbarrick.com/blog/d6plinks/20061221-01 den har jeg så lavet om fra C Sharp til VB.

Jeg er grøn i .Net så kan godt have lavet en fejl men antog at der da var en del ASP.NET kode så skulle dette selvf. være i en Code_Behind fil, men det kan da godt være jeg skal lave det om og slette min Code_Behind og tage koden fra den fil og smide det ind i et Script tag på TuringImage.aspx, men er ikke sikker.
Avatar billede tjgrindsted Nybegynder
26. marts 2007 - 23:48 #6
Jeg har lavet de to sider om til det som han viser på hans side bare i VB, men får stadigvæk kun vist en images Error, håber du eller en anden evt. kan hjælpe.

captcha.aspx
<%@ Page Language="VB" AutoEventWireup="false" %>
<%@ Import Namespace="System" %>
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="System.Web.Mail" %>

<script runat="server">
    Private random As Random = New Random

    Private Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
        Dim formOK As Boolean = True
        If Not Me.IsPostBack Then
            'Create a random code and store it in the Session object.
            Me.Session("TuringImageText") = GenerateRandomCode()
        Else
            'Create a random code and store it in the Session object.
            'On a postback, check the user input.
            'Check Turing code
            Try
                Dim turingText As String = Me.Session("TuringImageText").ToString
            Catch
                Me.Session("TuringImageText") = GenerateRandomCode()
            End Try
            'Clear the input and create a new random code.
            If Not (Me.CodeNumberTextBox.Text = Me.Session("TuringImageText").ToString) Then
                Me.MessageLabel.CssClass = "error"
                Me.MessageLabel.Text = "Validation code does not match. Please try again."
                Me.CodeNumberTextBox.BackColor = System.Drawing.Color.Yellow
                Me.CodeNumberTextBox.Text = ""
                Me.Session("TuringImageText") = GenerateRandomCode()
                'Label1.Text = this.Session["TuringImageText"].ToString(); //debug
                formOK = False
            Else
                'If the right code has been entered, clear the error message
                Me.MessageLabel.Text = ""
                Me.CodeNumberTextBox.BackColor = System.Drawing.Color.White
            End If
            If Me.fName.Text = "" Then
                Me.fName.BackColor = System.Drawing.Color.Yellow
                formOK = False
            Else
                Me.fName.BackColor = System.Drawing.Color.White
            End If
            If formOK = True Then
                'Everything is OK, do whatever you need to with the submitted data
                'Such as mailing it, inserting into a DB, etc.
                Response.Write("<html><head>")
                Response.Write("<script>")
                Response.Write("alert('Thank you.\n\nYou will now be returned to the home page.');")
                Response.Write("location.href='/';")
                Response.Write("<" + HtmlTextWriter.SlashChar + "script>")
                Response.Write("<" + HtmlTextWriter.SlashChar + "head><body><center><a href='/'>HOME<" + HtmlTextWriter.SlashChar + "a><" + HtmlTextWriter.SlashChar + "center><" + HtmlTextWriter.SlashChar + "body><" + HtmlTextWriter.SlashChar + "html>")
                Response.End()
            Else
                'If there are validation errors write out an error message.
                Label1.Text = "Required fields failed validation. They are hightlighted in yellow.<br />"
                Label1.BackColor = System.Drawing.Color.Yellow
                Label1.ForeColor = System.Drawing.Color.Red
            End If
        End If
    End Sub
    'Returns a string of six random digits.
    Private Function GenerateRandomCode() As String
        Dim s As String = ""
        Dim c As Integer = 97
        Dim i As Integer = 0
        While i < 6
            If random.Next(2) = 1 Then
                c = random.Next(48, 57)
            Else
                c = random.Next(97, 122)
            End If
            s = String.Concat(s, Convert.ToChar(c).ToString)
            System.Math.Min(System.Threading.Interlocked.Increment(i), i - 1)
        End While
        Return s
    End Function
</script>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
  <form id="default" runat="server">
  <asp:Label ID="Label1" runat="server" Text=""></asp:Label>
  <img src="TuringImage.aspx" alt="" /><br />
  Enter the code above in the box below to begin:<br />
  <small>(Note: If you cannot read the numbers in the image, reload the page to generate a new one.)</small><br />
  <asp:TextBox id="CodeNumberTextBox" runat="server"></asp:TextBox>
  <asp:Label id="MessageLabel" runat="server"></asp:Label><br />
  Name:<asp:TextBox runat="server" id="fName" maxlength="50" Columns="50" /><br />
  <asp:Button id="SubmitButton" runat="server" Text="Submit"></asp:Button>
</form>
</body>
</html>


TuringImage.aspx
<%@ Page Language="VB" AutoEventWireup="false" %>
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="System.Collections" %>
<%@ Import Namespace="System.ComponentModel" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Drawing" %>
<%@ Import Namespace="System.Drawing.Drawing2D" %>
<%@ Import Namespace="System.Drawing.Imaging" %>
<%@ Import Namespace="System.Web" %>
<%@ Import Namespace="System.Web.SessionState" %>
<%@ Import Namespace="System.Web.UI" %>
<%@ Import Namespace="System.Web.UI.WebControls" %>
<%@ Import Namespace="System.Web.UI.HtmlControls" %>

<script runat="server">
    Private random As Random = New Random

    Private Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
        'Width and height of image
        Dim width As Integer = 200
        Dim height As Integer = 50
        Dim familyName As String = "Times New Roman"
        'String imageText = "123456";
        Dim imageText As String = Me.Session("TuringImageText").ToString
        'Create a new 32-bit bitmap image.
        Dim bitmap As System.Drawing.Image = New Bitmap(width, height, PixelFormat.Format32bppArgb)
        'Create a graphics object for drawing.
        Dim g As Graphics = Graphics.FromImage(bitmap)
        g.SmoothingMode = SmoothingMode.AntiAlias
        Dim rect As Rectangle = New Rectangle(0, 0, width, height)
        'Fill in the background.
        Dim hatchBrush As HatchBrush = New HatchBrush(HatchStyle.SmallConfetti, Color.LightGray, Color.White)
        g.FillRectangle(hatchBrush, rect)
        'Set up the text font.
        Dim size As SizeF
        Dim fontSize As Single = rect.Height + 1
        Dim font As Font
        'Adjust the font size until the text fits within the image.
        Do
            System.Math.Max(System.Threading.Interlocked.Decrement(CLng(fontSize)), fontSize + 1)
            font = New Font(familyName, fontSize, FontStyle.Bold)
            size = g.MeasureString(imageText, font)
        Loop While size.Width > rect.Width
        'Set up the text format.
        Dim format As StringFormat = New StringFormat
        format.Alignment = StringAlignment.Center
        format.LineAlignment = StringAlignment.Center
        'Create a path using the text and warp it randomly.
        Dim path As GraphicsPath = New GraphicsPath
        path.AddString(imageText, font.FontFamily, CType(font.Style, Integer), font.Size, rect, format)
        Dim v As Single = 4.0F
        Dim points As PointF() = {New PointF(Me.random.Next(rect.Width) / v, Me.random.Next(rect.Height) / v), New PointF(rect.Width - Me.random.Next(rect.Width) / v, Me.random.Next(rect.Height) / v), New PointF(Me.random.Next(rect.Width) / v, rect.Height - Me.random.Next(rect.Height) / v), New PointF(rect.Width - Me.random.Next(rect.Width) / v, rect.Height - Me.random.Next(rect.Height) / v)}
        Dim matrix As Matrix = New Matrix
        matrix.Translate(0.0F, 0.0F)
        path.Warp(points, rect, matrix, WarpMode.Perspective, 0.0F)
        'Draw the text.
        hatchBrush = New HatchBrush(HatchStyle.LargeConfetti, Color.LightGray, Color.DarkGray)
        g.FillPath(hatchBrush, path)
        'Add some random noise.
        Dim m As Integer = Math.Max(rect.Width, rect.Height)
        Dim i As Integer = 0
        While i < CType((rect.Width * rect.Height / 30.0F), Integer)
            Dim x As Integer = Me.random.Next(rect.Width)
            Dim y As Integer = Me.random.Next(rect.Height)
            Dim w As Integer = Me.random.Next(m / 50)
            Dim h As Integer = Me.random.Next(m / 50)
            g.FillEllipse(hatchBrush, x, y, w, h)
            System.Math.Min(System.Threading.Interlocked.Increment(i), i - 1)
        End While
        'Change the response headers to output a JPEG image.
        Me.Response.Clear()
        Me.Response.ContentType = "image/jpeg"
        bitmap.Save(Me.Response.OutputStream, ImageFormat.Jpeg)
        'Clean up.
        'font.Dispose();
        hatchBrush.Dispose()
        g.Dispose()
    End Sub
</script>
Avatar billede tjgrindsted Nybegynder
27. marts 2007 - 00:13 #7
Forresten så hæver jeg gerne point sats hvis det er..
Avatar billede thesurfer Nybegynder
28. marts 2007 - 10:49 #8
Jeg har ikke haft tid til at kigge på det.. jeg vil se om jeg kan få tid i løbet af dagen..
Avatar billede thesurfer Nybegynder
28. marts 2007 - 10:49 #9
PS: Du behøver ikke at hæve pointsne.
Avatar billede thesurfer Nybegynder
28. marts 2007 - 10:51 #10
Ifølge teksten ( http://www.mbarrick.com/blog/d6plinks/20061221-01 ) skal det ikke være code-behind:

"A while back I needed to hack together a simple Turing test image for a form that was living on an MCMS server I didn't have full access to. All the examples of CAPTCHA image .NET code I found out there assumed the developer had full access to install compiled code onto the server. I needed something quick and easy with no code-behind, no .dll to install, that could be uploaded via FTP. The code I cobbled together is dead simple, just two .aspx files with some server-side C# and as a bonus includes a sample of how to do some friendly field validation while you're at it."
Avatar billede tjgrindsted Nybegynder
28. marts 2007 - 11:09 #11
Hej TheSurfer

Helt iorden.

Ja det så jeg også og derfor lavede jeg dem så i de 2 sider, og uploadede dem men det virker stadigvæk ikke http://www.kennelenggaard.dk/captcha.aspx og hvis jeg bare prøver at køre TuringImage.aspx alene så laver den intet billede http://www.kennelenggaard.dk/TuringImage.aspx koden jeg har fået ved at lave disse to sider om fra C Sharp til VB.NET er dem fra tjgrindsted 26/03-2007 23:48:03.

Håber du evt. kan frembringe en løsning ;)
Avatar billede tjgrindsted Nybegynder
28. marts 2007 - 20:50 #12
Hej igen

Hvis jeg tager det CSharp eks. og laver det i CSharp så virker det.
http://www.kennelenggaard.dk/captchaCSharp.aspx
Men laver jeg det om med CSHARP to VB konverter http://www.eggheadcafe.com/articles/cstovbweb/converter.aspx
så kan jeg ikke få det til at virke
http://www.kennelenggaard.dk/captchaVB.aspx

Kan du eller en anden evt. prøve at konventerer det til VB.NET da det er det jeg har hele mit side i !?
Avatar billede thesurfer Nybegynder
28. marts 2007 - 23:05 #13
Jeg har (vis Microsoft Visual Studio) fundet ud af, at den overhovedet ikke afvikler Page_Load..

Den eneste linie der bliver afviklet, er:

Private random As Random = New Random

Den hopper bare ud derfra..
Avatar billede thesurfer Nybegynder
28. marts 2007 - 23:39 #14
Hmm.. Jeg kan simpelthen ikke få VB.Net til at afvikle Page_Load sub'en..

Se om du kan få det her eksempel til at virke:

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="mintest.aspx.vb" Inherits="mintest" %>

<script runat="server">
    Private mintest As String = "Det virker IKKE! :-("
       
    Private Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
        mintest = "Det VIRKER! :-)"
    End Sub
</script>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    <% Response.Write(mintest)%>
    </div>
    </form>
</body>
</html>


Hvis det IKKE virker, står der "Det virker IKKE! :-("

Hvis det VIRKER, står der "Det VIRKER! :-)"
Avatar billede thesurfer Nybegynder
28. marts 2007 - 23:54 #15
Ved at sætte AutoEventWireup="true" til "true" i stedet for "false", har jeg fået den til at afvikle Page_Load..

Jeg er igang med at se hvorfor det ikke virker..
Avatar billede thesurfer Nybegynder
29. marts 2007 - 00:43 #16
Nu har jeg fået VB.Net udgaven til at virke..

Jeg rydder lige lidt op, og smider koden herind..
Avatar billede thesurfer Nybegynder
29. marts 2007 - 00:54 #17
Rettelserne:

Da C# koden blev konverteret til VB.NET kode, blev noget kode åbenbart misfortolket.

Det er bl.a. denne VB.NET linie:
System.Math.Max(System.Threading.Interlocked.Decrement(CLng(fontSize)), fontSize + 1)

Den trækker 1 fra værdien i variablen fontSize. Det skal bare være: fontSize = fontSize - 1

Det samme med System.Math.Min, der skulle have været "i = i + 1"

Så er der formOK (som er bool/boolean, dvs sand/falsk, true/false) der var sat forkert i denne blok:

            If Not (Me.CodeNumberTextBox.Text = Me.Session("TuringImageText").ToString) Then
                Me.MessageLabel.CssClass = "error"
                Me.MessageLabel.Text = "Validation code does not match. Please try again."
                Me.CodeNumberTextBox.BackColor = System.Drawing.Color.Yellow
                Me.CodeNumberTextBox.Text = ""
                Me.Session("TuringImageText") = GenerateRandomCode()
                'Label1.Text = this.Session["TuringImageText"].ToString(); //debug
                formOK = False
            Else

Den skal være True og ikke False.


Og den sidste ændring:

Hvis AutoEventWireup er sat til False, afvikles Page_Load ikke!
Den har jeg sat til True: AutoEventWireup="true"


Her er koden:


--- captcha.aspx (formen og genererer selve koden der indsættes i billedet):

<%@ Page Language="VB" AutoEventWireup="true" Debug="true" %>
<%@ Import Namespace="System" %>
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="System.Web.Mail" %>

<script runat="server">
    Private random As Random = New Random

    Private Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
        Dim formOK As Boolean = true
        If Not Me.IsPostBack Then
            'Create a random code and store it in the Session object.
            Me.Session("TuringImageText") = GenerateRandomCode()
        Else
            'Create a random code and store it in the Session object.
            'On a postback, check the user input.
            'Check Turing code
           
            Try
                Dim turingText = Me.Session("TuringImageText").ToString
            Catch
                Me.Session("TuringImageText") = GenerateRandomCode()
            End Try
            'Clear the input and create a new random code.
            If Not (Me.CodeNumberTextBox.Text = Me.Session("TuringImageText").ToString) Then
                Me.MessageLabel.CssClass = "error"
                Me.MessageLabel.Text = "Validation code does not match. Please try again."
                Me.CodeNumberTextBox.BackColor = System.Drawing.Color.Yellow
                Me.CodeNumberTextBox.Text = ""
                Me.Session("TuringImageText") = GenerateRandomCode()
                'Label1.Text = this.Session["TuringImageText"].ToString(); //debug
                formOK = True ' This must be set/reset to TRUE -- Denne skal saettes/nulstilles til TRUE
            Else
                'If the right code has been entered, clear the error message
                Me.MessageLabel.Text = ""
                Me.CodeNumberTextBox.BackColor = System.Drawing.Color.White
            End If
           
            ' ---------------
            ' This part is optional! -- denne del kan fjernes!
            If Me.fName.Text = "" Then
                Me.fName.BackColor = System.Drawing.Color.Yellow
                formOK = False
            Else
                Me.fName.BackColor = System.Drawing.Color.White
            End If
            ' ---------------
           
            If formOK = True Then
                'Everything is OK, do whatever you need to with the submitted data
                'Such as mailing it, inserting into a DB, etc.
                Response.Write("<html><head>")
                Response.Write("<script>")
                Response.Write("alert('Thank you.\n\nYou will now be returned to the home page.');")
                Response.Write("location.href='/';")
                Response.Write("<" + HtmlTextWriter.SlashChar + "script>")
                Response.Write("<" + HtmlTextWriter.SlashChar + "head><body><center><a href='/'>HOME<" + HtmlTextWriter.SlashChar + "a><" + HtmlTextWriter.SlashChar + "center><" + HtmlTextWriter.SlashChar + "body><" + HtmlTextWriter.SlashChar + "html>")
                Response.End()
            Else
                'If there are validation errors write out an error message.
                Label1.Text = "Required fields failed validation. They are hightlighted in yellow.<br />"
                Label1.BackColor = System.Drawing.Color.Yellow
                Label1.ForeColor = System.Drawing.Color.Red
            End If
        End If
    End Sub
    'Returns a string of six random digits.
    Private Function GenerateRandomCode() As String
        Dim s As String = ""
        Dim c As Integer = 97
        Dim i As Integer = 0
        While i < 6
            If random.Next(2) = 1 Then
                c = random.Next(48, 57)
            Else
                c = random.Next(97, 122)
            End If
            s = String.Concat(s, Convert.ToChar(c).ToString)
            System.Math.Min(System.Threading.Interlocked.Increment(i), i - 1)
        End While
        Return s
    End Function
</script>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
  <form id="default" runat="server">
  <asp:Label ID="Label1" runat="server" Text=""></asp:Label>
  <img src="TuringImage.aspx" alt="" /><br />
  Enter the code above in the box below to begin:<br />
  <small>(Note: If you cannot read the numbers in the image, reload the page to generate a new one.)</small><br />
  <asp:TextBox id="CodeNumberTextBox" runat="server"></asp:TextBox>
  <asp:Label id="MessageLabel" runat="server"></asp:Label><br />
  Name:<asp:TextBox runat="server" id="fName" maxlength="50" Columns="50" /><br />
  <asp:Button id="SubmitButton" runat="server" Text="Submit"></asp:Button>
</form>
</body>
</html>



--- TuringImage.aspx (genererer selve billedet med teksten fra captcha.aspx):


<%@ Page Language="VB" AutoEventWireup="true" %>
<%@ Import Namespace="System" %>
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="System.Collections" %>
<%@ Import Namespace="System.ComponentModel" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Drawing" %>
<%@ Import Namespace="System.Drawing.Drawing2D" %>
<%@ Import Namespace="System.Drawing.Imaging" %>
<%@ Import Namespace="System.Web" %>
<%@ Import Namespace="System.Web.SessionState" %>
<%@ Import Namespace="System.Web.UI" %>
<%@ Import Namespace="System.Web.UI.WebControls" %>
<%@ Import Namespace="System.Web.UI.HtmlControls" %>

<script runat="server">
    Private random As Random = New Random

    Private Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
        'Width and height of image
        Dim width As Integer = 200
        Dim height As Integer = 50
        Dim familyName As String = "Times New Roman"
        'Dim imageText As String = "123456"
        Dim imageText As String = Me.Session("TuringImageText").ToString
        'Create a new 32-bit bitmap image.
        Dim bitmap As System.Drawing.Image = New Bitmap(width, height, PixelFormat.Format32bppArgb)
        'Create a graphics object for drawing.
        Dim g As Graphics = Graphics.FromImage(bitmap)
        g.SmoothingMode = SmoothingMode.AntiAlias
        Dim rect As Rectangle = New Rectangle(0, 0, width, height)
        'Fill in the background.
        Dim hatchBrush As HatchBrush = New HatchBrush(HatchStyle.SmallConfetti, Color.LightGray, Color.White)
        g.FillRectangle(hatchBrush, rect)
        'Set up the text font.
        Dim size As SizeF
        Dim fontSize As Single = rect.Height + 1
        Dim font As Font
        'Adjust the font size until the text fits within the image.
        Do
            fontSize = fontSize - 1
            'System.Math.Max(System.Threading.Interlocked.Decrement(CLng(fontSize)), fontSize + 1)
            font = New Font(familyName, fontSize, FontStyle.Bold)
            size = g.MeasureString(imageText, font)
        Loop While size.Width > rect.Width
        'Set up the text format.
        'font = New Font("Times New Roman", 12, FontStyle.Bold)
        'size = g.MeasureString(imageText, font)
       
        Dim format As StringFormat = New StringFormat
        format.Alignment = StringAlignment.Center
        format.LineAlignment = StringAlignment.Center
        'Create a path using the text and warp it randomly.
        Dim path As GraphicsPath = New GraphicsPath
        path.AddString(imageText, font.FontFamily, CType(font.Style, Integer), font.Size, rect, format)
        Dim v As Single = 4.0F
        Dim points As PointF() = {New PointF(Me.random.Next(rect.Width) / v, Me.random.Next(rect.Height) / v), New PointF(rect.Width - Me.random.Next(rect.Width) / v, Me.random.Next(rect.Height) / v), New PointF(Me.random.Next(rect.Width) / v, rect.Height - Me.random.Next(rect.Height) / v), New PointF(rect.Width - Me.random.Next(rect.Width) / v, rect.Height - Me.random.Next(rect.Height) / v)}
        Dim matrix As Matrix = New Matrix
        matrix.Translate(0.0F, 0.0F)
        path.Warp(points, rect, matrix, WarpMode.Perspective, 0.0F)
        'Draw the text.
        hatchBrush = New HatchBrush(HatchStyle.LargeConfetti, Color.LightGray, Color.DarkGray)
        g.FillPath(hatchBrush, path)
        'Add some random noise.
        Dim m As Integer = Math.Max(rect.Width, rect.Height)
        Dim i As Integer = 0
        While i < CType((rect.Width * rect.Height / 30.0F), Integer)
            Dim x As Integer = Me.random.Next(rect.Width)
            Dim y As Integer = Me.random.Next(rect.Height)
            Dim w As Integer = Me.random.Next(m / 50)
            Dim h As Integer = Me.random.Next(m / 50)
            g.FillEllipse(hatchBrush, x, y, w, h)
            'System.Math.Min(System.Threading.Interlocked.Increment(i), i - 1)
            i = i + 1
        End While
        'Change the response headers to output a JPEG image.
        Me.Response.Clear()
        Me.Response.ContentType = "image/jpeg"
        bitmap.Save(Me.Response.OutputStream, ImageFormat.Jpeg)
        'Clean up.
        'font.Dispose();
        hatchBrush.Dispose()
        g.Dispose()
    End Sub
</script>
Avatar billede thesurfer Nybegynder
29. marts 2007 - 00:55 #18
..og svar :-)
Avatar billede tjgrindsted Nybegynder
29. marts 2007 - 09:29 #19
Jeg kan først tjekke det efter 18 da jeg er på arbejde men tror 100% at det virker når du skriver det.

Men hvis jeg har haft problemer med konverteringen til VB.NET kode. kan du så sige mig hvor jeg kan få CSharp kode konverteret til VB-NEt kode som ikke bliver misfortolket i så høj en grad som den er blevet !?
Avatar billede tjgrindsted Nybegynder
29. marts 2007 - 09:39 #20
og forresten

ang. captcha.aspx jeg kan bare slette det i IF sætningen hvis jeg vil smides til en anden side uden en popup altså Response.red.... istedet for det i mellem IF og Else.

i dette område:
           
            If formOK = True Then
                'Everything is OK, do whatever you need to with the submitted data
                'Such as mailing it, inserting into a DB, etc.
                Response.Write("<html><head>")
                Response.Write("<script>")
                Response.Write("alert('Thank you.\n\nYou will now be returned to the home page.');")
                Response.Write("location.href='/';")
                Response.Write("<" + HtmlTextWriter.SlashChar + "script>")
                Response.Write("<" + HtmlTextWriter.SlashChar + "head><body><center><a href='/'>HOME<" + HtmlTextWriter.SlashChar + "a><" + HtmlTextWriter.SlashChar + "center><" + HtmlTextWriter.SlashChar + "body><" + HtmlTextWriter.SlashChar + "html>")
                Response.End()
            Else
                'If there are validation errors write out an error message.
                Label1.Text = "Required fields failed validation. They are hightlighted in yellow.<br />"
                Label1.BackColor = System.Drawing.Color.Yellow
                Label1.ForeColor = System.Drawing.Color.Red
            End If
Avatar billede thesurfer Nybegynder
29. marts 2007 - 10:31 #21
Jeg ved ikke hvor man kan få konverteret C# til VB.Net henne.. søg evt på Google..


Ang IF-blokken: Ja, du bestemmer selv..

If formOK = True Then
' brugeren har indtastet den rigtige kode.. gør et eller andet
Else
' det indtastede matchede ikke billede.. gør et eller andet
End If
Avatar billede tjgrindsted Nybegynder
29. marts 2007 - 19:09 #22
det virker bare 1000 tak TheSurfer
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester