Ik heb een website waarbij ik een bitmap realtime kan transformeren op basis van een [transformatieID] die verwijst naar een set transformaties om uit te voeren. Om de load voor de processor te beperken maak ik gebruik van system.web.runtime.cache. Het proces is als volgt:
Tot dusver de pseudocode zodat duidelijk is wat er gebeurd. Wat er fout gaat is dat ik bij stap 3.1 steevast een "Invalid parameter used" fout krijg van Bitmap.save. Op internet worden wel soortgelijke problemen gemeld, maar niet specifiek wat ik hier heb. Hieronder de code:
Indien de cache nog niet is gevuld werkt alles naar behoren. Als er echter een image in de cache zit, opgehaald en weergegeven wordt gaat het mis. Ik krijg dan de error "Invalid parameter used" bij regel 42. Het ophalen van de image uit de cache gaat echter wel goed. Voor het laden is objImage nog 'Nothing', daarna is het 'System.Drawing.Bitmap'. Toch reageert de code, bij regel 42, alsof het object ongeldig is. Heeft iemand enig idee hoe dit te verhelpen is en waar het door komt?
code:
1
2
3
4
5
6
7
8
9
10
| 1. Maak cachekey (imageID & transformatieID)
2. Kijk in de cache (met cachekey) en haal object op
3. Indien object aanwezig is en van type (TypeOf) system.drawing.bitmap is:
1. Schrijf object naar scherm
2. Klaar
4. Haal image op uit file behorende bij imageID
5. Voer transformaties uit
6. Schrijf object naar cache (met cachekey)
7. Schrijf object naar scherm
8. Klaar |
Tot dusver de pseudocode zodat duidelijk is wat er gebeurd. Wat er fout gaat is dat ik bij stap 3.1 steevast een "Invalid parameter used" fout krijg van Bitmap.save. Op internet worden wel soortgelijke problemen gemeld, maar niet specifiek wat ik hier heb. Hieronder de code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
| Public Shared Sub Load(ByVal intSiteID As Integer, ByVal intImageID As Integer, ByVal intTransformationID As Integer, &_
Optional ByVal blnCaching As Boolean = True)
Const strFunction As String = "Load"
Dim objImage As System.Drawing.Bitmap
Dim objImageFormat As System.Drawing.Imaging.ImageFormat
Dim arrRecord As Array
Dim strCacheKey As String
Dim strContentType As String
Dim strImageFile As String
Dim strImageFileExtension As String
Dim strImagePath As String
Dim intImageObjectID As Integer
Dim intImageRecordID As Integer
If blnCaching Then
strCacheKey = intImageID & ";" & intTransformationID
objImage = System.Web.HttpRuntime.Cache(strCacheKey)
If TypeOf objImage Is System.Drawing.Bitmap Then
System.Web.HttpContext.Current.Response.ContentType = "image/jpeg"
objImage.Save(System.Web.HttpContext.Current.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg)
Exit Sub
End If
End If
arrRecord = Freedom.Data.Database.GetRecordSetArray ("SP_Freedom_Images_Record_ForDisplay " & intImageID)
If arrRecord Is Nothing Then Freedom.ErrorHandling.SetEvent(intSiteID, 119, strFunction, "Image [" & intImageID & "].", "")
strImagePath = Freedom.Tools.Strings.StringDecode(arrRecord(0, 0))
intImageObjectID = arrRecord(1, 0)
intImageRecordID = arrRecord(2, 0)
strImageFile = Freedom.Tools.Strings.StringDecode(arrRecord(3, 0))
strImageFileExtension = Freedom.Tools.Strings.StringDecode(arrRecord(4, 0))
objImage = System.Drawing.Image.FromFile(strImagePath & "\" & intImageObjectID & "\" & intImageRecordID & "\" & strImageFile)
If Not intTransformationID = 0 Then Freedom.Objects.Images.Images.Manipulation.Transform(intSiteID, objImage, intTransformationID)
If blnCaching Then System.Web.HttpRuntime.Cache.Insert(strCacheKey, &_
objImage, Nothing, DateTime.Now.AddMinutes(30), System.TimeSpan.Zero, &_
System.Web.Caching.CacheItemPriority.Normal, Nothing)
System.Web.HttpContext.Current.Response.ContentType = "image/jpeg"
objImage.Save(System.Web.HttpContext.Current.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg)
objImage.Dispose()
End Sub |
Indien de cache nog niet is gevuld werkt alles naar behoren. Als er echter een image in de cache zit, opgehaald en weergegeven wordt gaat het mis. Ik krijg dan de error "Invalid parameter used" bij regel 42. Het ophalen van de image uit de cache gaat echter wel goed. Voor het laden is objImage nog 'Nothing', daarna is het 'System.Drawing.Bitmap'. Toch reageert de code, bij regel 42, alsof het object ongeldig is. Heeft iemand enig idee hoe dit te verhelpen is en waar het door komt?