2013-02-23 7 views
5

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.

risposta

0

Dovresti avere l'immagine (come byte []) già memorizzata da qualche parte, passarla a questa funzione ResizeBytes, insieme alle nuove dimensioni che desideri rendere l'immagine restituita.

private byte[] ResizeBytes(byte[] byteImageIn, int NewWidth, int NewHeight) 
{ 
    //Convert Bytes to Image 
    MemoryStream ms1 = new MemoryStream(byteImageIn); 
    Image img = Image.FromStream(ms1); 

    //Convert Image in to new image with new dimensions, padding with a white background 
    img = FixedSize(img, NewWidth, NewHeight); 

    //Convert image back to a byte array 
    MemoryStream ms2 = new MemoryStream(); 
    img.Save(ms2, System.Drawing.Imaging.ImageFormat.Jpeg); 
    byte[] imageBytes = ms2.ToArray(); 
    return imageBytes; 
} 

La funzione FixedSize:

private Image FixedSize(Image imgPhoto, int Width, int Height) 
{ 
    int sourceWidth = imgPhoto.Width; 
    int sourceHeight = imgPhoto.Height; 
    int sourceX = 0; 
    int sourceY = 0; 
    int destX = 0; 
    int destY = 0; 

    float nPercent = 0; 
    float nPercentW = 0; 
    float nPercentH = 0; 

    nPercentW = ((float)Width/(float)sourceWidth); 
    nPercentH = ((float)Height/(float)sourceHeight); 
    if (nPercentH < nPercentW) 
    { 
     nPercent = nPercentH; 
     destX = System.Convert.ToInt16((Width - 
         (sourceWidth * nPercent))/2); 
    } 
    else 
    { 
     nPercent = nPercentW; 
     destY = System.Convert.ToInt16((Height - 
         (sourceHeight * nPercent))/2); 
    } 

    int destWidth = (int)(sourceWidth * nPercent); 
    int destHeight = (int)(sourceHeight * nPercent); 

    Bitmap bmPhoto = new Bitmap(Width, Height, 
         PixelFormat.Format48bppRgb); //Format24bppRgb 
    bmPhoto.SetResolution(imgPhoto.HorizontalResolution, 
        imgPhoto.VerticalResolution); 

    Graphics grPhoto = Graphics.FromImage(bmPhoto); 
    grPhoto.Clear(Color.White); 
    grPhoto.InterpolationMode = 
      InterpolationMode.HighQualityBicubic; 

    grPhoto.DrawImage(imgPhoto, 
     new Rectangle(destX, destY, destWidth, destHeight), 
     new Rectangle(sourceX, sourceY, sourceWidth, sourceHeight), 
     GraphicsUnit.Pixel); 

    grPhoto.Dispose(); 
    return bmPhoto; 
} 
+0

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

+0

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. –