C#OpenXML插入图像质量差,图像模糊
它可以工作并以适当的大小插入图像,但图像质量比资源差(图像有点模糊,颜色差别也很小)。 我曾尝试从eXcel单元格复制/粘贴图像,它的大小与手动放置的大小相同 我已尝试将其转换为不同的值,但没有任何帮助:C#OpenXML插入图像质量差,图像模糊,c#,.net,excel,openxml,xlsx,C#,.net,Excel,Openxml,Xlsx,它可以工作并以适当的大小插入图像,但图像质量比资源差(图像有点模糊,颜色差别也很小)。 我曾尝试从eXcel单元格复制/粘贴图像,它的大小与手动放置的大小相同 我已尝试将其转换为不同的值,但没有任何帮助: A.BlipCompressionValues.None 方法调用 MemoryStream imageLogoStream = new MemoryStream(); Properties.Resources.logo.Save(imageLogoStream, ImageFormat.J
A.BlipCompressionValues.None
方法调用
MemoryStream imageLogoStream = new MemoryStream();
Properties.Resources.logo.Save(imageLogoStream, ImageFormat.Jpeg);
AddImage(ws.WorksheetPart, "H27", imageMemoryStream, description);
下面是插入图像的代码
public bool AddImage(WorksheetPart worksheetPart, string addressName,
Stream imageStream, string imgDesc)
{
UInt32 rowNumber = GetRowIndex(addressName);
UInt32 colNumber = GetColumnIndex(addressName);
// We need the image stream more than once, thus we create a memory copy
MemoryStream imageMemStream = new MemoryStream();
imageStream.Position = 0;
imageStream.CopyTo(imageMemStream);
imageStream.Position = 0;
imageMemStream.Position = 0;
var drawingsPart = worksheetPart.DrawingsPart;
if (drawingsPart == null)
drawingsPart = worksheetPart.AddNewPart<DrawingsPart>();
if (!worksheetPart.Worksheet.ChildElements.OfType<Drawing>().Any())
{
worksheetPart.Worksheet.Append(new Drawing { Id = worksheetPart.GetIdOfPart(drawingsPart) });
}
if (drawingsPart.WorksheetDrawing == null)
{
drawingsPart.WorksheetDrawing = new Xdr.WorksheetDrawing();
}
var worksheetDrawing = drawingsPart.WorksheetDrawing;
try
{
Bitmap bm = new Bitmap(imageMemStream);
var imagePart = drawingsPart.AddImagePart(GetImagePartTypeByBitmap(bm));
imageStream.Position = 0;
imagePart.FeedData(imageStream);
A.Extents extents = new A.Extents();
var extentsCx = bm.Width * (long)(914400 / bm.HorizontalResolution);
var extentsCy = bm.Height * (long)(914400 / bm.VerticalResolution);
bm.Dispose();
var colOffset = 0;
var rowOffset = 0;
var nvps = worksheetDrawing.Descendants<Xdr.NonVisualDrawingProperties>();
var nvpId = nvps.Count() > 0
? (UInt32Value)worksheetDrawing.Descendants<Xdr.NonVisualDrawingProperties>().Max(p => p.Id.Value) + 1
: 1U;
var oneCellAnchor = new Xdr.OneCellAnchor(
new Xdr.FromMarker
{
ColumnId = new Xdr.ColumnId((colNumber - 1).ToString()),
RowId = new Xdr.RowId((rowNumber - 1).ToString()),
ColumnOffset = new Xdr.ColumnOffset(colOffset.ToString()),
RowOffset = new Xdr.RowOffset(rowOffset.ToString())
},
new Xdr.Extent { Cx = extentsCx, Cy = extentsCy },
new Xdr.Picture(
new Xdr.NonVisualPictureProperties(
new Xdr.NonVisualDrawingProperties { Id = nvpId, Name = "Picture " + nvpId, Description = imgDesc },
new Xdr.NonVisualPictureDrawingProperties(new A.PictureLocks { NoChangeAspect = true })
),
new Xdr.BlipFill(
new A.Blip { Embed = drawingsPart.GetIdOfPart(imagePart), CompressionState = A.BlipCompressionValues.None },
new A.Stretch(new A.FillRectangle())
),
new Xdr.ShapeProperties(
new A.Transform2D(
new A.Offset { X = 0, Y = -1 },
new A.Extents { Cx = extentsCx, Cy = extentsCy }
),
new A.PresetGeometry { Preset = A.ShapeTypeValues.Rectangle }
)
),
new Xdr.ClientData()
);
worksheetDrawing.Append(oneCellAnchor);
return true;
}
catch (Exception ex)
{
return false;
}
}
public bool AddImage(工作表部分工作表部分,字符串地址名称,
流imageStream,字符串imgDesc)
{
UInt32 rowNumber=GetRowIndex(addressName);
UInt32 colNumber=GetColumnIndex(addressName);
//我们需要图像流不止一次,因此我们创建了一个内存拷贝
MemoryStream imageMemStream=新的MemoryStream();
imageStream.Position=0;
CopyTo(imageMemStream);
imageStream.Position=0;
imageMemStream.Position=0;
var drawingsPart=工作表部分drawingsPart;
如果(drawingsPart==null)
drawingsPart=工作表部件.AddNewPart();
如果(!worksheetPart.Worksheet.ChildElements.OfType().Any())
{
worksheetPart.Worksheet.Append(新图形{Id=worksheetPart.GetIdOfPart(drawingsPart)});
}
如果(drawingsPart.WorksheetDrawing==null)
{
drawingsPart.WorksheetDrawing=新建Xdr.WorksheetDrawing();
}
var worksheetDrawing=drawingsPart.worksheetDrawing;
尝试
{
位图bm=新位图(imageMemStream);
var imagePart=drawingsPart.AddImagePart(GetImagePartTypeByBitmap(bm));
imageStream.Position=0;
imagePart.FeedData(imageStream);
A.范围=新的A.范围();
var extentsCx=bm.宽度*(长)(914400/bm.水平分辨率);
var extentsCy=bm.高度*(长)(914400/bm.垂直分辨率);
bm.Dispose();
var-colOffset=0;
var-rowOffset=0;
var nvps=worksheetDrawing.subjects();
var nvpId=nvps.Count()>0
?(uint32值)工作表drawing.substands().Max(p=>p.Id.Value)+1
:1U;
var oneCellAnchor=new Xdr.oneCellAnchor(
新Xdr.FromMarker
{
ColumnId=新的Xdr.ColumnId((colNumber-1.ToString()),
RowId=new Xdr.RowId((rowNumber-1.ToString()),
ColumnOffset=新的Xdr.ColumnOffset(colOffset.ToString()),
RowOffset=新的Xdr.RowOffset(RowOffset.ToString())
},
新的Xdr.Extent{Cx=extentsCx,Cy=extentsCy},
新Xdr.Picture(
新Xdr.NonVisualPictureProperties(
新的Xdr.NonVisualDrawingProperties{Id=nvpId,Name=“Picture”+nvpId,Description=imgDesc},
新的Xdr.NonVisualPictureDrawingProperties(新的A.PictureLocks{NoChangeAspect=true})
),
新Xdr.BlipFill(
新的A.Blip{Embed=drawingsPart.GetIdOfPart(imagePart),CompressionState=A.BlipCompressionValues.None},
新建A.Stretch(新建A.FillRectangle())
),
新Xdr.ShapeProperties(
新A.2D(
新的A.偏移量{X=0,Y=-1},
新的A.extensts{Cx=extentsCx,Cy=extentsCy}
),
新建A.PresetGeometry{Preset=A.ShapeTypeValues.Rectangle}
)
),
新的Xdr.ClientData()
);
工作表Drawing.Append(oneCellAnchor);
返回true;
}
捕获(例外情况除外)
{
返回false;
}
}