C# 图像处理-缩略图的自动调整/裁剪
我用这个撞到了砖墙。。。我知道我在逻辑上有缺陷,但我会解释我现在的处境 我正在(尝试)编写代码,为Silverlight应用程序底部的导航栏动态创建一个正方形(75x75)像素缩略图。 当我调试下面的代码时,在缩放嵌套循环的过程中,我会不断得到一个“数组索引越界”错误 (我只调试过srcWidth>srcHeight,一次一步) 我测试的源图像是307x162(49734像素) 此操作的dest大小(每个当前逻辑)为150x75(11250像素) 当然,在此之后,我打算将结果裁剪到75x75 在点击11251作为目标的索引之前,它只通过了源图像的一半。 我知道这是我的逻辑, 我只是不知道我用来建造目的地的尺寸是否有问题, 或者在将浮点数转换为整数的近似值中, 或者两者都不是 我不知道,这就是我在这里发帖的原因。。。无论如何,这是我的消息来源:C# 图像处理-缩略图的自动调整/裁剪,c#,silverlight,image,image-processing,C#,Silverlight,Image,Image Processing,我用这个撞到了砖墙。。。我知道我在逻辑上有缺陷,但我会解释我现在的处境 我正在(尝试)编写代码,为Silverlight应用程序底部的导航栏动态创建一个正方形(75x75)像素缩略图。 当我调试下面的代码时,在缩放嵌套循环的过程中,我会不断得到一个“数组索引越界”错误 (我只调试过srcWidth>srcHeight,一次一步) 我测试的源图像是307x162(49734像素) 此操作的dest大小(每个当前逻辑)为150x75(11250像素) 当然,在此之后,我打算将结果裁剪到75x75 在
private void ResizeNavBarImage(Image src)
{
const int SizeOfRGB = 4;
WriteableBitmap bmpSource = new WriteableBitmap((BitmapSource)src.Source);
int[] iSourcePixels = bmpSource.Pixels;
int srcWidth = bmpSource.PixelWidth;
int srcHeight = bmpSource.PixelHeight;
int destWidth = 75;
int destHeight = 75;
float xFactor = srcWidth / destWidth;
float yFactor = srcHeight / destHeight;
float xSource, ySource;
int iApprox;
int iIndex = 0;
if (srcWidth > srcHeight)
{
WriteableBitmap bmpDest = new WriteableBitmap((int)(destWidth * yFactor), destHeight);
int[] iDestPixels = bmpDest.Pixels;
// Resize srcHeight to destHeight, srcWidth to same ratio
for (int i = 0; i < srcHeight; i++)
{
for (int j = 0; j < srcWidth; j++)
{
xSource = j * yFactor;
ySource = i * yFactor;
iApprox = (int)(ySource * srcWidth + xSource);
iDestPixels[iIndex++] = iSourcePixels[iApprox];
}
}
// Crop half of difference from each side of the width
srcWidth = bmpDest.PixelWidth;
srcHeight = bmpDest.PixelHeight;
int xLeftOffset = (srcWidth - srcHeight) / 2;
WriteableBitmap bmpFinalDest = new WriteableBitmap(destWidth, destHeight);
for (int iPixelRow = 0; iPixelRow < destHeight; iPixelRow++)
{
int srcOffset = (iPixelRow * srcWidth + xLeftOffset) * SizeOfRGB;
int destOffset = iPixelRow * destWidth * SizeOfRGB;
Buffer.BlockCopy(bmpDest.Pixels, srcOffset, bmpFinalDest.Pixels, destOffset, destWidth * SizeOfRGB);
}
src.Source = (ImageSource)bmpFinalDest;
}
else if (srcWidth < srcHeight)
{
WriteableBitmap bmpDest = new WriteableBitmap(destWidth, (int)(destHeight * xFactor));
int[] iDestPixels = bmpDest.Pixels;
// Resize srcWidth to destWidth, srcHeight to same ratio
for (int i = 0; i < srcHeight; i++)
{
for (int j = 0; j < srcWidth; j++)
{
xSource = j * xFactor;
ySource = i * xFactor;
iApprox = (int)(ySource * srcWidth + xSource);
iDestPixels[iIndex++] = iSourcePixels[iApprox];
}
}
// Crop half of difference from each side of the height
srcWidth = bmpDest.PixelWidth;
srcHeight = bmpDest.PixelHeight;
int yTopOffset = (srcHeight - srcWidth) / 2;
WriteableBitmap bmpFinalDest = new WriteableBitmap(destWidth, destHeight);
for (int iPixelRow = yTopOffset; iPixelRow < (destHeight - (yTopOffset * 2)); iPixelRow++)
{
int srcOffset = iPixelRow * srcWidth * SizeOfRGB;
int destOffset = iPixelRow * destWidth * SizeOfRGB;
Buffer.BlockCopy(bmpDest.Pixels, srcOffset, bmpFinalDest.Pixels, destOffset, destWidth * SizeOfRGB);
}
src.Source = (ImageSource)bmpFinalDest;
}
else // (srcWidth == srcHeight)
{
WriteableBitmap bmpDest = new WriteableBitmap(destWidth, destHeight);
int[] iDestPixels = bmpDest.Pixels;
// Resize and set source
for (var i = 0; i < srcHeight; i++)
{
for (var j = 0; j < srcWidth; j++)
{
xSource = j * xFactor;
ySource = i * yFactor;
iApprox = (int)(ySource * srcWidth + xSource);
iDestPixels[iIndex++] = iSourcePixels[iApprox];
}
}
src.Source = (ImageSource)bmpDest;
}
}
private void ResizeNavBarImage(图像src)
{
常数int SizeOfRGB=4;
WriteableBitmap bmpSource=新的WriteableBitmap((位图源)src.Source);
int[]iSourcePixels=bmpSource.Pixels;
int srcWidth=bmpSource.PixelWidth;
int srchheight=bmpSource.PixelHeight;
宽度=75;
高度=75;
float xFactor=srcWidth/destWidth;
float yFactor=srcHeight/destHeight;
浮动xSource、ySource;
int iApprox;
国际指数=0;
如果(srcWidth>srcHeight)
{
WriteableBitmap bmpDest=新的WriteableBitmap((int)(destWidth*yFactor),destHeight);
int[]iDestPixels=bmpDest.Pixels;
//将srcHeight调整为destHeight,srcWidth调整为相同比率
对于(int i=0;i
===============================================================================
以下是我为子孙后代编写的工作代码(带有WriteableBitmapEx):
private void ResizeNavBarImage(Image src)
{
WriteableBitmap bmpSource = new WriteableBitmap((BitmapSource)src.Source);
int srcWidth = bmpSource.PixelWidth;
int srcHeight = bmpSource.PixelHeight;
int finalDestWidth = 75;
int finalDestHeight = 75;
// Resize
float xFactor = ((float)finalDestWidth / (float)srcWidth);
float yFactor = ((float)finalDestHeight / (float)srcHeight);
float Factor = 0;
if (xFactor < yFactor)
Factor = yFactor;
else
Factor = xFactor;
int destWidth = (int)(srcWidth * Factor);
int destHeight = (int)(srcHeight * Factor);
if (destWidth < destHeight && destWidth != finalDestWidth)
destWidth = finalDestWidth;
else if (destWidth > destHeight && destHeight != finalDestHeight)
destHeight = finalDestHeight;
WriteableBitmap bmpDest = bmpSource.Resize(destWidth, destHeight, WriteableBitmapExtensions.Interpolation.Bilinear);
// Crop
int Offset;
WriteableBitmap bmpFinalDest = new WriteableBitmap(finalDestWidth, finalDestHeight);
if (destWidth > destHeight)
{
Offset = (bmpDest.PixelWidth - bmpDest.PixelHeight) / 2;
if (finalDestWidth % 2 != 0 && Offset % 2 == 0)
Offset -= 1;
bmpFinalDest = bmpDest.Crop(Offset, 0, finalDestWidth, finalDestHeight);
}
else if (destWidth < destHeight)
{
Offset = (bmpDest.PixelHeight - bmpDest.PixelWidth) / 2;
if (finalDestHeight % 2 != 0 && Offset % 2 == 0)
Offset -= 1;
bmpFinalDest = bmpDest.Crop(0, Offset, finalDestWidth, finalDestHeight);
}
else
bmpFinalDest = bmpDest;
src.Source = (ImageSource)bmpFinalDest;
}
private void ResizeNavBarImage(图像src)
{
WriteableBitmap bmpSource=新的WriteableBitmap((位图源)src.Source);
int srcWidth=bmpSource.PixelWidth;
int srchheight=bmpSource.PixelHeight;
int finalDestWidth=75;
int finalDestHeight=75;
//调整大小
float xFactor=((float)finalestwidth/(float)srcWidth);
浮动Y因子=((浮动)最终高度/(浮动)高度);
浮动系数=0;
if(xFactorWriteableBitmap wb = new WriteableBitmap(src, new ScaleTransform() { ScaleX = 0.25, ScaleY = 0.25 });
wb.Invalidate();
src.Source = wb;