1

我继承了一个需要打印存储在数据库中的图像数组的应用程序。我已经编写了通过 Web 服务检索图像的代码,并将图像放入 BitmapImage 数组中。

但是,当我将 BitmapImage 添加到图像的源时,图像是空的。没有抛出异常,但似乎没有图像被添加到列表中,并且一旦我将图像添加到数组中,代码似乎就停止了。

任何提示将不胜感激。

在类的标题中:

\\BitmapImage is System.Windows.Media.Imaging.BitmapImage

public List<BitmapImage> prtImages;


完成异步获取图像时 Web 服务的事件处理程序:

void client_GetImagesCompleted(object sender, OrderImageWebService.GetOrderImagesCompletedEventArgs e)
{
    if (e.Error != null)
    {
        System.Windows.Browser.HtmlPage.Window.Eval("alert('Error occurred loading images.');");
        throw new Exception(string.Format("Error loading image edits: {0}", e.Error));
    }
    else if ((!e.Cancelled) && (e.Result != null))
    {
        try
        {
            for (int i = 0; i <= imgs; i++)
            {
                byte[] bImage = loi[i].Content;
                using (System.IO.MemoryStream sioms = 
                    new System.IO.MemoryStream(bImage, 0, bImage.Length))
                {
                    bi.SetSource(sioms);
                    int ph = bi.PixelHeight;  //Alert shows 3296
                    int pw = bi.PixelWidth;   //Alert shows 2560
                    System.Windows.Browser.HtmlPage.Window.Eval(
                        string.Format("alert('BI image is {0} by {1}.');", 
                        ph.ToString(), pw.ToString()));

                        prtImages.Add(bi);

                        //This alert never shows
                        System.Windows.Browser.HtmlPage.Window.Eval(
                            string.Format("alert('prtImages has size {1} after add.');",  
                            prtImages.Count.ToString()));
                }
            }
        }
        catch(Exception ex)
        {
            //This exception is never caught
            System.Windows.Browser.HtmlPage.Window.Eval(string.Format("alert('{0}');", ex.Message));
        }
    }
    else
    {
        System.Windows.Browser.HtmlPage.Window.Eval("alert('Oops. Error.');");
    }

    System.Windows.Browser.HtmlPage.Window.Eval("alert('Clearing wait.');");

    bPrtImageLoaded = true;
    ewh_gotImages.Set();
}



在 GetPrintImage 中:

public Image GetPrintImage(int iPageID)
{
    if (bPrtImageLoaded)
    {
        Image img = new Image();
        img.Source = prtImages[iPageID];

        double ah = img.ActualHeight;
        double aw = img.ActualWidth;

        System.Windows.Browser.HtmlPage.Window.Eval(
            string.Format("alert('Image is {0} by {1}.');", 
            ah.ToString(), aw.ToString()));

        if (null != img)
        {
            return (img);
        }
    }

    return(null);
}



从按钮单击调用

private void p_printMultiplePages(object sender, System.Windows.Printing.PrintPageEventArgs e)
{
    Image img = GetPrintImage(iCurPrintPage);

    if (null != img)
    {
        if (e.PrintableArea.Height < img.ActualHeight)
        {
            scale = e.PrintableArea.Height / img.ActualHeight;
        }

        if ((e.PrintableArea.Width < img.ActualWidth) && ((e.PrintableArea.Width / img.ActualWidth) < scale))
        {
            scale = e.PrintableArea.Width / img.ActualWidth;
        }

        if (scale < 1)
        {
            scaleTransform.ScaleX = scale;
            scaleTransform.ScaleY = scale;
            img.RenderTransform = scaleTransform;
        }

        e.PageVisual = img;

        iCurPrintPage++;
        if (iCurPrintPage < SessionState.PageCount)
        {
            e.HasMorePages = true;
        }
        else
        {
            e.HasMorePages = false;
        }
    }
    else
    {
        System.Windows.Browser.HtmlPage.Window.Eval(
            string.Format("alert('Image {0} of order {1} is null.');", 
            iCurPrintPage.ToString(), SessionState.OrderID.ToString()));
        e.HasMorePages = false;
    }
}

感谢您提供的任何提示,

布鲁斯。

4

1 回答 1

0

我建议从 Web 服务获取图像作为二进制数据 (byte[] ) 将每个图像编码为 base64 并发布 base64 字符串数组。在客户端上,您将使用 base64 字符串将数组的每个元素解码回 byte[]。使用 MemoryStream 读取它并将该对象传递给您的图像阅读器(从 bytes 读取这个读取图像

但在您执行任何操作之前,请确保您的 p_printMultiplePages 方法可以显示本地图像

于 2013-11-14T20:33:05.023 回答