Forum: VB.NET |
Thema:
AW: AW: Thumbnails |
Von:
Thomas Hauser (
15.08.2007 18:41) |
Hallo,
folgende Tipps:
1. Option Explicit/Strict auf On stellen, dann können eine Vielzahl von Fehlern besser herausgefunden werden. Variablen haben immer einen Typ.
2. Die Methode GetThumbnailImage benötigt einen die Übergabe einer Instanz des Delegaten Image.GetThumbnailImageAbort, da dieser bestimmt, ob nach einer bestimmten Zeit die Generierung des Thumbnails abgebrochen werden soll. Wenn man das nicht will, in der Methode einfach False zurückgeben.
3. Mach das Ganze als eine Klasse, die durch eine Methode eine typisierte Liste zurückgibt, dann kann man das einfach als ObjectDataSource verwenden und spart sich viel manuelle Binden von Daten.
Hier der Code der Klassen für die ObjectDataSource:
Option Strict On
Option Explicit On
Imports System.IO
Imports System.Drawing
Imports System.Drawing.Imaging
Imports System.Collections.Generic
Public Class ImagesDataSource
Public imgFolder As String = "images"
Public Function GetImages() As List(Of ImageSource)
Dim images As New List(Of ImageSource)
GetImages(images, New DirectoryInfo(HttpContext.Current.Server.MapPath(imgFolder)), imgFolder)
Return images
End Function
Public Sub GetImages(ByVal images As List(Of ImageSource), ByVal dir As DirectoryInfo, ByVal BaseUrl As String)
For Each file As FileInfo In dir.GetFiles("*.jpg")
If Not file.Name.StartsWith("Thumb_") Then
images.Add(New ImageSource(BaseUrl, file))
End If
Next
For Each subDir As DirectoryInfo In dir.GetDirectories()
Dim newBaseUrl As String = String.Format("{0}/{1}", _
BaseUrl, subDir.Name)
GetImages(images, subDir, newBaseUrl)
Next
End Sub
End Class
Public Class ImageSource
Private _File As FileInfo
Private _ImageFolder As String
Public ReadOnly Property ImageUrl() As String
Get
Return String.Format("{0}/{1}", Me._ImageFolder, Me._File.Name)
End Get
End Property
Public ReadOnly Property ThumbUrl() As String
Get
Dim thumbnail As New FileInfo(Path.Combine( _
_File.Directory.FullName, _
String.Format("Thumb_{0}", Me._File.Name)))
If Not thumbnail.Exists Then
Dim bmp As New Bitmap(Me._File.FullName)
Dim thumb As Image = bmp.GetThumbnailImage(50, 50, New Image.GetThumbnailImageAbort(AddressOf OnThumbnailAbort), IntPtr.Zero)
thumb.Save(thumbnail.FullName)
End If
Return String.Format("{0}/{1}", Me._ImageFolder, thumbnail.Name)
End Get
End Property
Public ReadOnly Property ImageName() As String
Get
Return Path.GetFileNameWithoutExtension(_File.Name)
End Get
End Property
Public Sub New(ByVal imageFolder As String, ByVal file As FileInfo)
Me._ImageFolder = imageFolder
Me._File = file
End Sub
Public Sub New(ByVal imageFolder As String, ByVal filename As String)
Me.New(imageFolder, New FileInfo(filename))
End Sub
Private Function OnThumbnailAbort() As Boolean
Return False
End Function
End Class
Hier der Code für meine Beispiel Web Form:
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" %>
<!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>Unbenannte Seite</title>
<style type="text/css">
div.thumb {
float: left;
}
</style>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" SelectMethod="GetImages" TypeName="ImagesDataSource"></asp:ObjectDataSource>
<asp:Repeater ID="Repeater1" runat="server" DataSourceID="ObjectDataSource1">
<ItemTemplate>
<div class="thumb">
<a href='<%# Eval("ImageUrl") %>' title='Bild <%# Eval("ImageName") %> in voller Größe'>
<img src='<%# Eval("ThumbUrl") %>' alt='<%# Eval("ImageName") %>' />
</a>
</div>
</ItemTemplate>
</asp:Repeater>
<asp:Image ID="Image1" runat="server"/>
</div>
</form>
</body>
</html>
Thomas Hauser (Trainer und Consultant, Blog: http://thomashauser.spaces.live.com, Forum: http://www.sharepointbook.de - Die Forum-Webseite zum Buch!)
Antworten
Vorsicht bei der Eingabe: Die Zeichen ' oder -- sind nicht erlaubt!