2010-05-07 6 views
2

Я работаю с объектом Crystal Reports в Visual Studio 2008 (C#). Отчет строит отлично, и данные привязываются правильно. Однако, когда я пытаюсь изменить размер IBlobFieldObject из источника, масштаб становится искаженным.Crystal Reports Programmatic Image Resizing ... Scale?

Две записи об этом сценарии. Исходное изображение - 1024x768, максимальная ширина и высота - 720x576. Моя математика должна быть правильной, чтобы мой новый размер изображения был 720x540 (чтобы соответствовать максимальным требованиям по ширине и высоте). Отношение это неправильно, когда я делаю это, хотя:

img = Image.FromFile(path); 
newWidth = img.Size.Width; 
newHeight = img.Size.Height; 

if ((img.Size.Width > 720) || (img.Size.Height > 576)) 
{ 
    double ratio = Convert.ToDouble(img.Size.Width)/Convert.ToDouble(img.Size.Height); 
    if (ratio > 1.25) // Adjust width to 720, height will fall within range 
    { 
     newWidth = 720; 
     newHeight = Convert.ToInt32(Convert.ToDouble(img.Size.Height) * 720.0/Convert.ToDouble(img.Size.Width)); 
    } 
    else     // Adjust height to 576, width will fall within range 
    { 
     newHeight = 576; 
     newWidth = Convert.ToInt32(Convert.ToDouble(img.Size.Width) * 576.0/Convert.ToDouble(img.Size.Height)); 
    } 

    imgRpt.Section3.ReportObjects["image"].Height = newHeight; 
    imgRpt.Section3.ReportObjects["image"].Width = newWidth; 
} 

Я ступил через код, чтобы убедиться, что значения являются правильными из математики, и я даже сохранил изображение файла, чтобы убедиться, что соотношение сторон правильное (это было). Независимо от того, что я пытаюсь, изображение сжато - почти так, как если бы значения Scale были отключены в дизайнере Crystal Reports (это не так). Заранее благодарю за любую помощь!

ответ

2

Существует несколько проблем с тем, как Crystal Reports обрабатывает IBlobFieldObjects. Первая проблема, с которой я столкнулся, заключалась в том, что встроенная документация была неправильной для свойств Height и Width ReportObjects Crystal Reports. В нем говорится, что значения указаны в твитах, которые они НЕ. Например:

ImageReport imgRpt = new ImageReport(); 
// The following value should be in PIXELS... NOT twips as the docs suggest! 
imgRpt.Section3.ReportObjects["image"].Height = 300; 

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

public byte[] imageToByteArray(System.Drawing.Image imageIn) 
    { 
     MemoryStream ms = new MemoryStream(); 
     // The following line was ImageFormat.Jpeg, but it caused sizing issues 
     // in Crystal Reports. Changing to ImageFormat.Bmp made the squashed 
     // problems go away. 
     imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp); 
     return ms.ToArray(); 
    } 

Суммируя, кажется, что Crystal Reports предпочитает ImageFormat.Bmp для заполнения IBlobFieldObjects. Теперь, если кто-нибудь может сказать мне, как исправить ужасный бит-код использования ImageFormat.Bmp (скорее всего, объект Crystal Reports Report обрабатывает данные изображения и, возможно, не может быть исправлен), я был бы настроен.