2013-02-23 25 views
5

Tôi đã cố gắng tìm kiếm mã này và có thể hoạt động như tôi thấy, nhưng hình ảnh kết quả trong Báo cáo tinh thể của tôi là 5 trang thay vì 1 một số lý do!Thay đổi kích thước hình ảnh và đặt trong mảng byte cho CrystalReports BlobField

Về cơ bản, tôi có Báo cáo tinh thể có hình ảnh toàn trang được chụp từ BlobField hoạt động hoàn hảo khi hình ảnh nguồn rộng 2409 pixel và cao 3436 pixel @ 300 dpi.

Khi tôi cố gắng sử dụng một hình ảnh nguồn đó là năm 1700, rộng cao @ 200 dpi 2436, chiều cao hình ảnh là quá lớn và treo tắt báo cáo lên trang tiếp theo một chút

tôi nghĩ "không có vấn đề, Tôi sẽ chỉ thay đổi kích thước hình ảnh và báo cáo sẽ hiển thị chính xác "nhưng tôi gặp khó khăn lớn khi làm như vậy .. Đây là mã tôi đang sử dụng tại thời điểm này - khi sử dụng kích thước hình ảnh" bình thường "và mã này, mọi thứ hiển thị tốt trong báo cáo nhưng nếu tôi cần phải thay đổi kích thước, nó trải rộng ồ ạt và hơn NĂM trang thậm chí còn tồi tệ hơn để lại nó một mình! :(

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 

Vì vậy, tôi lấy hình ảnh ban đầu vào một mảng byte (như tôi giả định kích thước hình ảnh là "bình thường" theo mặc định và sẽ chỉ cần chèn nó thẳng vào BlobField) và sau đó chuyển đổi nó trở lại vào Nếu kích thước không phải là "bình thường" thì tôi sẽ thay đổi kích thước hình ảnh, sau đó chuyển đổi nó thành một mảng byte để nạp vào BlobField trong báo cáo.

Đây là hình ảnh thay đổi kích cỡ mã:

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 

Có thể tôi đang giải quyết vấn đề không chính xác nhưng cơ bản đồng minh Tôi đang cố gắng tìm một cách để cho phép các hình ảnh có kích thước bất kỳ bị rơi vào Crystal Reports BlobField và yêu cầu họ chiếm một trang A4 đầy đủ.

Trả lời

0

Bạn nên có hình ảnh của mình (dưới dạng byte []) được lưu trữ ở đâu đó, chuyển nó tới hàm ResizeBytes này, cùng với thứ nguyên mới bạn muốn hình ảnh trả về của mình.

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; 
} 

Các FixedSize chức năng:

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

Cảm ơn rất nhiều vì trả lời của bạn Dave! Tôi thực sự đã kết thúc sửa đổi đối tượng báo cáo đã hiển thị hình ảnh thay thế, nhưng tôi vẫn đánh giá cao việc bạn cung cấp câu trả lời trực tiếp cho câu hỏi này :) Tôi sẽ quay lại mã đó và xem mã của bạn như thế nào. Bạn có thể cho tôi biết có vấn đề gì với mã tôi đã cố sử dụng không? Nó có xác nhận của msgbox độ phân giải tôi thay đổi kích cỡ là những gì tôi muốn, nhưng khi tôi đặt đốm màu thay đổi kích thước vào báo cáo đó là lớn! – user2101511

+0

Tôi đã tìm kiếm một giải pháp cho vấn đề này một thời gian dài, thậm chí giao nhiệm vụ cho anh chàng báo cáo của tôi và anh ta không thể tìm ra một giải pháp chỉ sử dụng các báo cáo tinh thể. Vì vậy, chúng tôi đã phải đi lên với các bên trên để giải quyết vấn đề và nó hoạt động tuyệt vời cho chúng tôi. Tuy nhiên, chúng tôi đang sử dụng logo của công ty nhỏ, v.v. Có một sự sụt giảm về chất lượng sau khi thay đổi kích cỡ, và vì cách sử dụng của chúng tôi, nó không phải là một vấn đề lớn. Milage của bạn có thể khác nhau. –

Các vấn đề liên quan