如何使多个Excel电子表格上的图像始终以全尺寸显示(Aspose Cells)?

我正在使用以下代码在电子表格上放置图像:

var ms = new MemoryStream(); Image _logo = RoboReporterConstsAndUtils.GetURLImage("http://www.proactusa.com/bla/pa_logo_notag.png"); _logo.Save(ms, ImageFormat.Png); ms.Position = 0; locationWorksheet.Pictures.Add(0, 4, ms); AutoFitterOptions options = new AutoFitterOptions { OnlyAuto = true }; locationWorksheet.AutoFitRows(options); 

它工作正常; 但是,我在两个不同的报告中使用了相同的代码,并且图像以不同的大小显示。 其中一个高度为0.85“(63%),宽度为1.1”(53%),另一个高度为1.44“(106%),宽度为2.07”(100%)。

为什么他们的大小不一样? 为什么他们不是100%的原始图像大小?

另一个代码看上去完全一样(尽pipe在这种情况下图像出现的列是dynamic的):

 var ms = new MemoryStream(); Image _logo = RoboReporterConstsAndUtils.GetURLImage("http://www.proactusa.com/bla/pa_logo_notag.png"); _logo.Save(ms, ImageFormat.Png); ms.Position = 0; pivotTableSheet.Pictures.Add(0, _grandTotalsColumnPivotTable - 1, ms); AutoFitterOptions options = new AutoFitterOptions { OnlyAuto = true }; pivotTableSheet.AutoFitRows(options); 

图片本身,在参考位置,高度为1.35“,宽度为2.07”

所调用的方法是:

 internal static Image GetURLImage(string url) { WebClient wc = new WebClient(); byte[] bytes = wc.DownloadData(url); MemoryStream ms = new MemoryStream(bytes); return Image.FromStream(ms); } 

我怎样才能让图像始终以100%或至less以给定的尺寸显示?

UPDATE

我还有(至less现在)在同一个项目中使用EPPlus生成的一些报告。 在这些,我有以下代码,它允许我设置图像的确切大小:

 private void AddImage(ExcelWorksheet oSheet, int rowIndex, int colIndex) { Image _logo = RoboReporterConstsAndUtils.GetURLImage("http://www.proactusa.com/bla/pa_logo_notag.png"); var excelImage = oSheet.Drawings.AddPicture("PRO*ACT Logo", _logo); excelImage.From.Column = colIndex - 1; excelImage.From.Row = rowIndex - 1; excelImage.SetSize(199, 130); // 199WX130H is the actual size of the image excelImage.From.ColumnOff = Pixel2MTU(2); excelImage.From.RowOff = Pixel2MTU(2); } 

这就是所谓的:

 AddImage(deliveryPerformanceWorksheet, UNIT_ROW, LOGO_FIRST_COLUMN); 

…但是这不会在Aspose代码中飞行,因为表单是不同types的 – Aspose.Cells.Worksheet而不是ExcelWorksheet,因此代码如下:

 AddImage(locationWorksheet, 0, 4); 

…不会在Aspose报告中编译。 我希望我可以暂时将Aspose.Cells.Worksheet转换为ExcelWorksheet,如下所示:

 ExcelWorksheet ews = locationWorksheet; // naive attempt to magically morph an Aspose.Cells.Worksheet to an ExcelWorksheet AddImage(ews, 0, 4); 

…所以我可以调用AddImage(),但是这个公然的尝试被编译器吹口哨声,“ 不能隐式地将types”Aspose.Cells.Worksheet“转换为”OfficeOpenXml.ExcelWorksheet

更新2

图像是预期的大小; 这个代码:

 int h = _logo.Height; //130, as expected int w = _logo.Width; //199, " " 

…显示图像是原始大小。 问题是AutoFitterOptions设置? OnlyAuto是否允许对图像进行拉伸/挤压,取决于它所在的单元的大小?

更新3

在EPPlus中,我可以使用以下代码将图像显示为完全相同的大小:

 private void AddImage(ExcelWorksheet oSheet, int rowIndex, int colIndex) { Image _logo = RoboReporterConstsAndUtils.GetURLImage("http://www.proactusa.com/bla/pa_logo_notag.png"); var excelImage = oSheet.Drawings.AddPicture("PRO*ACT Logo", _logo); excelImage.From.Column = colIndex - 2; excelImage.From.Row = rowIndex - 1; excelImage.SetSize(199, 130); excelImage.From.ColumnOff = Pixel2MTU(2); excelImage.From.RowOff = Pixel2MTU(2); } 

…但在Aspose中我只能靠近使用:

 var ms = new MemoryStream(); Image _logo = RoboReporterConstsAndUtils.GetURLImage("http://www.proactusa.com/bla/pa_logo_notag.png"); _logo.Save(ms, ImageFormat.Png); ms.Position = 0; pivotTableSheet.Pictures.Add(0, _grandTotalsColumnPivotTable - 1, ms); 

EPPlus代码还保留了高度/宽度比例:

原始图像宽199像素,高130像素。

EPPlus-plopped图像是1.33 X 2.05,所以1.5:1(近似值)的比例保留。

Aspose-plopped图像虽然是1.63和1.67 X 2.07,所以比例更像是1.25:1

所以即使将AutoFitter爵士注释掉了Aspose代码,图片仍然会被压扁或拉伸。

更新4

基于这里的一个线程,我试过这个(将图像复制到我的bin文件夹):

 int index = locationWorksheet.Pictures.Add(0, 4, 6, 5, "LogoFromSite.png"); Picture pic = locationWorksheet.Pictures[index]; pic.Placement = PlacementType.FreeFloating; 

[sheet] .Pictures.Add()的前四个参数是左上行,左上行,右下行和右下行。

但是,这将图像放在正确的位置,然后移动到左边的几列(!?!)

更新5

我在这里发现了另一条希望之光,并尝试了下面的代码:

 Aspose.Cells.Rendering.ImageOrPrintOptions opts = new Aspose.Cells.Rendering.ImageOrPrintOptions(); opts.OnePagePerSheet = true; opts.ImageFormat = ImageFormat.Png; opts.SetDesiredSize(199, 130); Aspose.Cells.Rendering.SheetRender sr = new Aspose.Cells.Rendering.SheetRender(locationWorksheet, opts); sr.ToImage(0, "LogoFromSite.png"); 

…但得到这个:

在这里输入图像说明

所以:又压扁了。

更新6

我尝试了一些由Aspose Cells提供的代码,但是他们承认这个代码存在问题,并正在研究它。 只是为了咧嘴笑,我试了一下,看看会发生什么。 此代码:

 byte[] bts1 = File.ReadAllBytes("LogoFromSite.png"); byte[] bts2 = File.ReadAllBytes("LogoFromSite.png"); MemoryStream ms1 = new MemoryStream(); ms1.Write(bts1, 0, bts1.Length); ms1.Position = 0; //This is for second picture in sheet2 MemoryStream ms2 = new MemoryStream(); ms2.Write(bts2, 0, bts2.Length); ms2.Position = 0; //Add picture in first worksheet int idx = locationWorksheet.Pictures.Add(0, 4, ms1); //Add picture in second worksheet with original size idx = locationWorksheet.Pictures.Add(0, 10, ms2); Picture pic = locationWorksheet.Pictures[idx]; pic.HeightScale = 100; pic.WidthScale = 100; 

导致这些“没有图像的图像”:

在这里输入图像说明

更新7

我又做了一个冒险 随着高度的增加超过100%,我想我会调整形象到另一个,并使用:

 var ms = new MemoryStream(); Image _logo = GetURLImage("http://www.proactusa.com/bla/pa_logo_notag.png"); double newHeightDbl = _logo.Height * 0.8; int newHeightInt = (int)Math.Ceiling(newHeightDbl); Image resizedImage = ResizeImage(_logo, newHeightInt, _logo.Width); resizedImage.Save(ms, ImageFormat.Png); ms.Position = 0; locationWorksheet.Pictures.Add(0, 4, ms); 

…但不是! 它把整个文章塞进一个可怕的专栏,像这样:

在这里输入图像说明

……并垂直地把它大声说出来,这样在暴风雨的拖船上看起来比一个笨蛋看上去更加怪异。

这是(偷来的/借来的)代码来调整图像大小:

 // from http://stackoverflow.com/questions/1922040/resize-an-image-c-sharp public static Bitmap ResizeImage(Image image, int width, int height) { var destRect = new Rectangle(0, 0, width, height); var destImage = new Bitmap(width, height); destImage.SetResolution(image.HorizontalResolution, image.VerticalResolution); using (var graphics = Graphics.FromImage(destImage)) { graphics.CompositingMode = CompositingMode.SourceCopy; graphics.CompositingQuality = CompositingQuality.HighQuality; graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; graphics.SmoothingMode = SmoothingMode.HighQuality; graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; using (var wrapMode = new ImageAttributes()) { wrapMode.SetWrapMode(WrapMode.TileFlipXY); graphics.DrawImage(image, destRect, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, wrapMode); } } return destImage; } 

请检查您的线程在Aspose.Cells论坛 ,回答您的以下两个问题。

1 – 我们可以在工作簿和工作表中重复使用包含图片的相同内存stream对象吗?

2 – 如何添加原始大小的图片?

注意:我在Aspose作为Developer Evangelist工作

简单地说一下花式裤子自动安装代码的问题:

 //AutoFitterOptions options = new AutoFitterOptions { OnlyAuto = true }; //pivotTableSheet.AutoFitRows(options); 

现在,图像几乎以其实际大小均匀显示(但请注意下面的警告); 一个scosh“spilly”有时,但如果他们抱怨,我会创build第二个图像,并调整它使用这个:

 // from http://stackoverflow.com/questions/1922040/resize-an-image-c-sharp public static Bitmap ResizeImage(Image image, int width, int height) { var destRect = new Rectangle(0, 0, width, height); var destImage = new Bitmap(width, height); destImage.SetResolution(image.HorizontalResolution, image.VerticalResolution); using (var graphics = Graphics.FromImage(destImage)) { graphics.CompositingMode = CompositingMode.SourceCopy; graphics.CompositingQuality = CompositingQuality.HighQuality; graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; graphics.SmoothingMode = SmoothingMode.HighQuality; graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; using (var wrapMode = new ImageAttributes()) { wrapMode.SetWrapMode(WrapMode.TileFlipXY); graphics.DrawImage(image, destRect, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, wrapMode); } } return destImage; } 

注意力不足:这个效果很好,我不情愿地接受它,但放在表单上的图像不是完全一样的大小。 一个是1.67“X 2.07”,另一个是1.63“X 2.07” – 我猜,足够靠近Excel电子表格上的马蹄铁,手榴弹和图像。