0

サーバーの次のフォルダに画像が保存されています: \images\freemedia\largethumbs\test.png

私の default.aspx ページには、imagecontrol があります。

<asp:Image ID="Image1" runat="server" />

訪問者が default.aspx ページを要求すると、サーバーから test.png 画像を取得したいので、その右下に透かしテキスト "hello world" を追加します。ストレージを節約したいが、元の画像にアクセスしたいので、透かし入りの画像をサーバーに保存したくありません。訪問者に表示される画像から、元のファイル名を取得できないことが望ましいため、元のファイル名が test.png であることを確認できないようにする必要があります。

私はGoogleでよく検索してきましたが、すべての例で透かし入りの画像がディスクに保存されていますが、これは望ましくありません。

私はすでに httphandler を持っています:

Public Class pichandler : Implements IHttpHandler

Public Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
    Dim data As Byte()
    Dim fName As String 

    Using w As New generaltablesTableAdapters.freemediaTableAdapter
        fName = w.GetDataById(i)(0).medialink.ToString
    End Using
    data = My.Computer.FileSystem.ReadAllBytes(context.Server.MapPath("~/images/freemedia/thumbs/" & fName))

    ' --> how can I add a watermark text to the image here?!?!?!?

    context.Response.ContentType = "image/jpeg"
    context.Response.BinaryWrite(data)
End Sub


End Class

これを行う方法に関するコードサンプルはありますか?

これを行う別の方法があれば、それも問題ありません。しかし、透かし入りの画像を最終的な HTML の一部として提供する方法を教えてください。

4

1 に答える 1

3

asp.net を使用しているため、HttpHandlerを使用することもできます。

以下に例を示します。新しいジェネリック ハンドラーを作成します。これをImageHandlerと呼びましょう。コードは次のように簡単になります。

public class ImageHandler : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        // Clear response and set content type to image.
        context.Response.Clear();
        context.Response.ContentType = "image/jpeg";

        // Create your image, however you want it. Server.MapPath and so on.
        var image = Bitmap.FromFile(@"C:\Images\image.jpg");

        // And save it to the OutputStream.
        image.Save(context.Response.OutputStream, ImageFormat.Jpeg);
    }

    public bool IsReusable
    {
        get { return false; }
    }
}

そして、次のように使用します。

<asp:Image ID="Image1" ImageUrl="~/ImageHandler.ashx" runat="server" />

もちろん、次のようにいくつかのQueryStringパラメータを送信することもできます。

<asp:Image ID="Image1" ImageUrl="~/ImageHandler.ashx?filename=myimage.jpg" runat="server" />

そしてcontext.Request.QueryString["filename"]、ImageHandler で使用するだけです。


アップデート:

コメントの後に、透かしを追加する方法は次のとおりです。

Public Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
    Dim watermarkText As String = "Copyright"
    Dim fName As String 

    Using w As New TopTrouwen.generaltablesTableAdapters.freemediaTableAdapter
        fName = w.GetDataById(i)(0).medialink.ToString
    End Using

    ' Create image directly from the path
    Dim image = Drawing.Image.FromFile(context.Server.MapPath("~/images/freemedia/thumbs/" & fName))
    Dim font As New Font("Tahoma", 16, FontStyle.Regular, GraphicsUnit.Pixel)

    'Adds a transparent watermark 
    Dim color As Color = Drawing.Color.FromArgb(50, 0, 0, 0)
    Dim brush As New SolidBrush(color)
    Dim gr As Graphics = Graphics.FromImage(image)

    ' Measure the watermark text so we can offset it's width and height
    Dim watermarkSize = gr.MeasureString(watermarkText, font)

    ' Create the point where the watermark text should be printed
    Dim point As New Point(image.Width - watermarkSize.Width, image.Height - watermarkSize.Height)

    gr.DrawString(watermarkText, font, brush, point)
    gr.Dispose()

    context.Response.ContentType = "image/jpeg"
    image.Save(context.Response.OutputStream, ImageFormat.Jpeg)
End Sub
于 2012-12-11T22:28:05.730 に答える