arrays - 调整图像大小并放置在 CrystalReports BlobField 的字节数组中

标签 arrays vb.net image crystal-reports blob

我已尝试搜索此代码,并且代码在我所见的范围内应该可以工作,但是由于某种原因,我的 Crystal Report 中的结果图像是 5 页而不是 1 页!

基本上,我有一个 Crystal 报表,其中包含从 BlobField 获取的整页图像,当源图像为 2409 像素宽和 3436 像素高 @ 300 dpi 时,它可以完美运行。

当我尝试使用 1700 宽 x 2436 高 @ 200 dpi 的源图像时,图像高度太大并且将报告卡在下一页上

我想“没问题,我只需调整图像大小,报告就会正确显示”,但我在这样做时遇到了很大困难。这是我目前正在使用的代码——当使用“正常”图像大小时而这段代码,报告中的一切都显示得很好,但如果我需要调整大小,它会延伸到五页以上,这比不理会它还要糟糕! :(

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

所以我将原始图像抓取到一个字节数组中(因为我假设图像大小默认为“正常”,并且只会将其直接插入 BlobField),然后将其转换回图像以检查图像大小。如果大小不“正常”,那么我将调整图像大小,然后将其转换回字节数组以提供给报告中的 BlobField。

这是图像调整大小代码:
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

也许我没有正确地解决这个问题,但基本上我正在尝试找到一种方法来允许将任何大小的图像放入 Crystal Reports BlobField 并让它们占据一个完整的 A4 页面。

最佳答案

您应该已经将图像(作为 byte[])存储在某个地方,将其传递给此 ResizeBytes 函数,以及您希望返回的图像的新尺寸。

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

固定大小函数:
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;
}

关于arrays - 调整图像大小并放置在 CrystalReports BlobField 的字节数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15036677/

相关文章:

css - 赋予虚拟图像自然的宽度和高度以做出响应

javascript - 从图像中检索 EXIF

c - 为什么我们需要在给定的问题解决方案中初始化 MaxhourglassSum=(-63) ?

javascript - 无论输入如何,函数都返回 true

c# - 桌面应用程序和 Web 应用程序之间的通信

vb.net - PInvoke FormatMessage Message ByRef lpBuffer As [String] 没有

java - 检查 android Realm 中的唯一值

python - 在 Python 中插值 3d 数组扩展

vb.net - VB6 使用 VB.NET 类 - 速度很慢

ios - 在 iOS 应用程序中保留许多图像