Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用Windows.Media.Imaging命名空间调整动画gif的大小_C#_Asp.net_Wpf_Image Resizing_Animated Gif - Fatal编程技术网

C# 如何使用Windows.Media.Imaging命名空间调整动画gif的大小

C# 如何使用Windows.Media.Imaging命名空间调整动画gif的大小,c#,asp.net,wpf,image-resizing,animated-gif,C#,Asp.net,Wpf,Image Resizing,Animated Gif,我一直在Asp.NETHadler中使用GDI+实现来调整图像大小。我发现了一篇文章,其中描述了使用Windows.Media.Imaging调整图像大小更有效(更快,消耗更少的系统资源) 这种方法还有一个优点,我可以从源图像中读取单个帧,如gif。以下是我的部分代码: var photoDecoder = BitmapDecoder.Create(inputStream, BitmapCreateOptions.PreservePixelFormat,

我一直在Asp.NETHadler中使用GDI+实现来调整图像大小。我发现了一篇文章,其中描述了使用Windows.Media.Imaging调整图像大小更有效(更快,消耗更少的系统资源)

这种方法还有一个优点,我可以从源图像中读取单个帧,如gif。以下是我的部分代码:

var photoDecoder = BitmapDecoder.Create(inputStream, BitmapCreateOptions.PreservePixelFormat,
                                                BitmapCacheOption.None);
IEnumerable<BitmapFrame> bitmapFrames = from bitmapFrame in photoDecoder.Frames
                                                select bitmapFrame;

var bitmapFramesList = new List<BitmapFrame>();
bitmapFramesList.AddRange(bitmapFrames);

var firstFrame = bitmapFramesList.First();

int inputWidth = Convert.ToInt32(firstFrame.Width);
int inputHeight = Convert.ToInt32(firstFrame.Height);

var firstFrameSize= new Size(inputWidth, inputHeight);

//if targetSize is bigger than image Size render image as is
bool targetSizeIsBiggerOrEmpty = targetSize.IsEmpty || (targetSize.Width > firstFrameSize.Width && targetSize.Height > firstFrameSize.Height);   
if (targetSizeIsBiggerOrEmpty)
{
   inputStream.Position = ZERO;
   inputStream.CopyTo(catalogImage.Stream);
}
else
{
   //calculate size of target image
   Size imageSize = SizeCalculator.CalculateImageSize(new Size(Convert.ToInt32(firstFrame.Width),Convert.ToInt32(firstFrame.Height)), targetSize);
   if (targetSize.Width == ZERO)
      targetSize.Width = imageSize.Width;
   if (targetSize.Height == ZERO)
      targetSize.Height = imageSize.Height;

   double scaleX = Convert.ToDouble(imageSize.Width) / Convert.ToDouble(firstFrame.Width);
   double scaleY = Convert.ToDouble(imageSize.Height) / Convert.ToDouble(firstFrame.Height);
   double scale = Math.Min(scaleX, scaleY);

   var targetFrames= new Collection<BitmapFrame>();
   foreach (var sourceFrame in bitmapFramesList)
   {                    
      var transform = new ScaleTransform {ScaleX = scale, ScaleY = scale};
      var transformedBitmap = new TransformedBitmap(sourceFrame, transform);
      BitmapFrame bitmapFrame = BitmapFrame.Create(transformedBitmap);
      targetFrames.Add(bitmapFrame);
   }

   //my own method for saving image to response output stream
   SaveCatalogImage(catalogImage, targetFrames);
var photoDecoder=BitmapDecoder.Create(inputStream,BitmapCreateOptions.PreservePixelFormat,
BitmapCacheOption.None);
IEnumerable bitmapFrames=来自photoDecoder.Frames中的bitmapFrame
选择位图帧;
var bitmapFramesList=新列表();
bitmapFramesList.AddRange(bitmapFrames);
var firstFrame=bitmapFramesList.First();
int inputWidth=Convert.ToInt32(firstFrame.Width);
int inputhweight=Convert.ToInt32(firstFrame.Height);
var firstFrameSize=新大小(inputWidth,inputHeight);
//如果targetSize大于图像大小,请按原样渲染图像
bool targetsizeisbiggerrempty=targetSize.IsEmpty | |(targetSize.Width>firstFrameSize.Width&&targetSize.Height>firstFrameSize.Height);
if(targetSizeSizeBiggerEmpty)
{
inputStream.Position=0;
inputStream.CopyTo(catalogImage.Stream);
}
其他的
{
//计算目标图像的大小
Size imageSize=SizeCalculator.CalculateImageSize(新尺寸(Convert.ToInt32(firstFrame.Width)、Convert.ToInt32(firstFrame.Height))、targetSize);
如果(targetSize.Width==零)
targetSize.Width=图像大小.Width;
如果(targetSize.Height==零)
targetSize.Height=图像大小.Height;
double-scaleX=Convert.ToDouble(imageSize.Width)/Convert.ToDouble(firstFrame.Width);
double scaleY=Convert.ToDouble(imageSize.Height)/Convert.ToDouble(firstFrame.Height);
双刻度=数学最小值(scaleX,scaleY);
var targetFrames=新集合();
foreach(bitmapFramesList中的var sourceFrame)
{                    
var transform=new ScaleTransform{ScaleX=scale,ScaleY=scale};
var transformedBitmap=新的transformedBitmap(sourceFrame,transform);
BitmapFrame BitmapFrame=BitmapFrame.Create(转换位图);
targetFrames.Add(位图帧);
}
//我自己将图像保存到响应输出流的方法
SaveCatalogImage(catalogImage,targetFrames);
}

但这里有一个小问题。每个帧都有不同的大小,我无法根据第一帧的大小找到每个帧的位置。我还需要在目标图像中进行计时,就像在源图像中一样


我在哪里可以在源图像中找到这些信息?

看看这篇文章;它适用于WinRT,但应该很容易适应:。此示例也可能有用:。