[VB.NET] "Invalid parameter used" bij Bitmap.Save

Pagina: 1
Acties:

  • Christiaan
  • Registratie: Maart 2001
  • Laatst online: 09-08-2021
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:

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?

  • whoami
  • Registratie: December 2000
  • Laatst online: 19-02 23:53
helpt dit:
http://blogs.msdn.com/rob...ve/2004/07/11/179789.aspx

En hoe wat is de Position van je OutputStream ?

https://fgheysels.github.io/


  • Christiaan
  • Registratie: Maart 2001
  • Laatst online: 09-08-2021
Thanks Whoami. Ik had dat artikel ook al gevonden. Het probleem wat daar wordt geschetst wordt veroorzaakt door een instelling van de EncoderParameters. Die gebruik ik in mijn code niet, dus het lijkt me niet dat het daar ligt. Bovendien zou het in dat geval ook fout moeten gaan bij images die niet uit de cache worden geladen.

Ik kom er helemaal niet uit wat het is. Waar ik ook heen save, ik krijg deze error. Als ik een test bitmap aanmaak (New Bitmap(50, 50)), dan werkt het wel. Dus het object wordt op de een of andere manier ongeldig. Moet ik een image, die ik uit de cache haal, misschien op een andere manier casten?

  • whoami
  • Registratie: December 2000
  • Laatst online: 19-02 23:53
Het heeft volgens mij niet met je Bitmap zelf te maken, aangezien de foutmelding het heeft over een parameter.
Jouw save method heeft 2 parameters: die output stream en die ImageFormat enumaration.
Volgens mij zit de fout in de OutputStream. Heb je de position daarvan al eens op 0 gezet, voordat je die image saved ?

En waarom die Dispose trouwens ? Je stopt die image in je cache, en je disposed hem. Dus, de image die in je cache zit, is gedisposed. Dit zou wel eens het probleem kunnen zijn.

Met casting of manieren van casten heeft het niets te maken.
Ik zou trouwens ook die Exit Sub weglaten, en het andere deel van de code (als er niet gecached wordt dus), in de else tak van die if zetten.

https://fgheysels.github.io/


  • Christiaan
  • Registratie: Maart 2001
  • Laatst online: 09-08-2021
Wederom bedankt. Dit keer is het opgelost. Het zat hem idd in de objImage.dispose(). Ik had er niet bij stilgestaan dat als je de image al disposed dat mis gaat bij het cachen. Gelukkig werkt het nu weer. Heb er een hele tijd naar zitten zoeken :)