Ho provato a cercarlo e ho codice che dovrebbe funzionare per quanto posso vedere, ma l'immagine risultante nel mio Crystal Report è di 5 pagine invece di 1 per qualche ragione!Ridimensionare l'immagine e posizionarla in un array di byte per CrystalReports BlobField
Fondamentalmente, ho un report Crystal con un'immagine a pagina intera presa da un BlobField che funziona perfettamente quando l'immagine sorgente è larga 2409 pixel e alta 3436 pixel a 300 dpi.
Quando cerco di usare un'immagine di origine che è di 1700 di larghezza per 2436 alto @ 200 dpi, l'altezza dell'immagine è troppo grande ed appende fuori il report sulla pagina successiva un po '
ho pensato "non è un problema, Mi limiterò a ridimensionare l'immagine e il rapporto verrà visualizzato correttamente "ma ho grosse difficoltà a farlo. Ecco il codice che sto usando al momento - quando si utilizza la dimensione dell'immagine" normale "e questo codice, tutto visualizza bene nella relazione, ma se ho bisogno di ridimensionare, si estende massicciamente e oltre 5 pagine che è ancora peggio che lasciarlo da solo! :(
Dim fs As System.IO.FileStream = New System.IO.FileStream(FilePath, System.IO.FileMode.Open, System.IO.FileAccess.Read)
Dim Image() As Byte = New Byte(fs.Length - 1) {}
fs.Read(Image, 0, CType(fs.Length, Integer))
fs.Close()
'Byte[] to image
Dim imgMemoryStream = New IO.MemoryStream(Image)
Dim myImage = Drawing.Image.FromStream(imgMemoryStream)
' Check if image is 2409 wide, if it's not then resize to 2409 while preserving aspect ratio. WIN.
If myImage.Width <> 2409 Then
MsgBox("myimage before: " & myImage.Width & " by " & myImage.Height)
myImage = ImageResize(myImage, 3436, 2409)
MsgBox("myimage after: " & myImage.Width & " by " & myImage.Height)
Else
MsgBox("myimage (already correct for printing): " & myImage.Width & " by " & myImage.Height)
End If
Dim imgMemoryStream2 As IO.MemoryStream = New IO.MemoryStream()
myImage.Save(imgMemoryStream2, System.Drawing.Imaging.ImageFormat.Jpeg)
Image = imgMemoryStream2.ToArray
objDataRow(strImageField) = Image
così sto afferrando l'immagine originale in un array di byte (come presumo la dimensione dell'immagine è "normale" di default e sarà solo inserirla direttamente nel BlobField) e poi convertirlo nuovamente dentro un'immagine per controllare le dimensioni dell'immagine Se la dimensione non è "normale", allora ridimensiono l'immagine e la converto in un array di byte per alimentare il BlobField nel report.
Questa è la dimensione dell'immagine codice:
Public Shared Function ImageResize(ByVal image As System.Drawing.Image, _
ByVal height As Int32, ByVal width As Int32) As System.Drawing.Image
Dim bitmap As System.Drawing.Bitmap = New System.Drawing.Bitmap(width, height, image.PixelFormat)
If bitmap.PixelFormat = Drawing.Imaging.PixelFormat.Format1bppIndexed Or _
bitmap.PixelFormat = Drawing.Imaging.PixelFormat.Format4bppIndexed Or _
bitmap.PixelFormat = Drawing.Imaging.PixelFormat.Format8bppIndexed Or _
bitmap.PixelFormat = Drawing.Imaging.PixelFormat.Undefined Or _
bitmap.PixelFormat = Drawing.Imaging.PixelFormat.DontCare Or _
bitmap.PixelFormat = Drawing.Imaging.PixelFormat.Format16bppArgb1555 Or _
bitmap.PixelFormat = Drawing.Imaging.PixelFormat.Format16bppGrayScale Then
Throw New NotSupportedException("Pixel format of the image is not supported.")
End If
Dim graphicsImage As System.Drawing.Graphics = System.Drawing.Graphics.FromImage(bitmap)
graphicsImage.SmoothingMode = Drawing.Drawing2D.SmoothingMode.HighQuality
graphicsImage.InterpolationMode = Drawing.Drawing2D.InterpolationMode.HighQualityBicubic
graphicsImage.DrawImage(image, 0, 0, bitmap.Width, bitmap.Height)
graphicsImage.Dispose()
Return bitmap
End Function
Forse sto affrontando il problema in modo errato ma di base sto cercando di trovare un modo per consentire che le immagini di qualsiasi dimensione vengano rilasciate nel Crystal Reports BlobField e farle occupare una pagina A4 completa.
Grazie mille per la risposta Dave! Alla fine ho finito per modificare l'oggetto report che mostrava l'immagine, ma ho comunque apprezzato la tua risposta diretta a questa domanda :) Tornerò al codice lo stesso e vedrò come fa il tuo. Sei in grado di dirmi cosa c'è di sbagliato nel codice che ho provato ad usare? Ha msgbox che conferma la risoluzione che ho ridimensionato è quello che volevo, eppure quando metto il blob ridimensionato nel rapporto è enorme! – user2101511
Ho cercato per molto tempo una soluzione a questo problema, ho persino delegato l'attività al mio giornalista e non è riuscito a trovare una soluzione utilizzando solo report di cristallo. Quindi abbiamo dovuto inventare quanto sopra per risolvere il problema e funziona benissimo per noi. Tuttavia, stiamo usando piccoli loghi aziendali, ecc. Dopo il ridimensionamento c'è una leggera diminuzione della qualità e, a causa del nostro utilizzo, non è un grosso problema. La tua milizia può variare. –