1

I inherited an app that needs to print an array of images which are stored in a database. I have written the code to retrieve the images via a web service, and have put the images into an array of BitmapImage.

However when I add the BitmapImage to the source of the Image, the image is then empty. No exceptions are thrown, but it appears that no images are added to the list, and the code appears to simply halt as soon as I add the image to the array.

Any hints would be appreciated.

In header of class:

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

public List<BitmapImage> prtImages;


Event handler for web service on completion of getting images asynchronously:

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



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



Called from button click

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

Thanks for any hints you might have,

Bruce.

EverythingRightPlace
  • 1,197
  • 12
  • 33

1 Answers1

0

I would suggest getting images from web service as binary data (byte[] ) encoded each image as base64 and publish array of base64 strings. On the client you will decode each element of array with base64 stings back to byte[]. Read it with MemoryStream and pass that object to your Image reader (read this one reading image from bytes)

But before you do anything of that, make sure that your p_printMultiplePages method can display local images

Community
  • 1
  • 1
evhen14
  • 1,839
  • 12
  • 16