Оптимизировать изображение для Crystal Reports - PullRequest
0 голосов
/ 09 марта 2019

У меня есть таблица, которая содержит ~ 50 записей и 50 изображений.В отчете я создал изображение заполнителя.Каждая запись имеет уникальное изображение.

После того, как я получил исключение "переполнение памяти", я решил изменить размеры изображений перед добавлением в отчет.

Теперь все работает нормально, за исключением загрузки отчетов.время ~ 20-25 секВ будущем в этой таблице будет ~ 5000-10000 записей.

Вот мой код, который я использовал:1. Main.cs - событие клика на ToolStripMenuItem:

LoadImage(ds1.Tables[0].Rows[i], "imageUrlFoto", foldernameFoto + ds1.Tables[0].Rows[i]["FotoName"]);

Main.cs - LoadImages:

    private void LoadImage(DataRow objDataRow, string strImageField, string FilePath)
{
    try
    {
        FileStream fs = new FileStream(FilePath,
                   System.IO.FileMode.Open, System.IO.FileAccess.Read);
        byte[] Image = new byte[fs.Length];
        fs.Read(Image, 0, Convert.ToInt32(fs.Length));
        fs.Close();
        objDataRow[strImageField] = utils.Settings.CreateThumbnail(Image,new Size(200,200));
    }
    catch (Exception ex)
    {
        MessageBox.Show("ERROR: "+ex.Message);
    }
}

Utils.cs CreateThumbnail:

    public static byte[] CreateThumbnail(byte[] PassedImage, Size size)
{
    byte[] ReturnedThumbnail;

    using (MemoryStream StartMemoryStream = new MemoryStream(),
                        NewMemoryStream = new MemoryStream())
    {
        StartMemoryStream.Write(PassedImage, 0, PassedImage.Length);

        Bitmap startBitmap = new Bitmap(StartMemoryStream);

        int newHeight;
        int newWidth;
        double HW_ratio;

        int sourceWidth = startBitmap.Width;
        int sourceHeight = startBitmap.Height;

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

        nPercentW = ((float)size.Width / (float)sourceWidth);
        nPercentH = ((float)size.Height / (float)sourceHeight);

        if (nPercentH < nPercentW)
            nPercent = nPercentH;
        else
            nPercent = nPercentW;

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

        Bitmap newBitmap = new Bitmap(destWidth, destHeight);

        newBitmap = ResizeImage(startBitmap, destWidth, destHeight);

        newBitmap.Save(NewMemoryStream, System.Drawing.Imaging.ImageFormat.Jpeg);

        ReturnedThumbnail = NewMemoryStream.ToArray();
    }

    return ReturnedThumbnail;
}

Utils.cs Размер растрового изображения:

private static Bitmap ResizeImage(Bitmap image, int width, int height)
{
    Bitmap resizedImage = new Bitmap(width, height);
    using (Graphics gfx = Graphics.FromImage(resizedImage))
    {
        gfx.DrawImage(image, new Rectangle(0, 0, width, height),
            new Rectangle(0, 0, image.Width, image.Height), GraphicsUnit.Pixel);
    }
    return resizedImage;
} 

Заранее спасибо

...