相关疑难解决方法(0)

高质量图像缩放库

我想在C#中缩放图像,其质量水平与Photoshop一样好.有没有可用的C#图像处理库来做这件事?

c# image-manipulation image image-processing image-scaling

141
推荐指数
5
解决办法
13万
查看次数

C#已调整大小的图像具有黑色边框

我在.NET中的图像缩放有问题.我使用标准的Graphics类型来调整图像大小,如下例所示:

public static Image Scale(Image sourceImage, int destWidth, int destHeight)
{
        Bitmap toReturn = new Bitmap(sourceImage, destWidth, destHeight);

        toReturn.SetResolution(sourceImage.HorizontalResolution, sourceImage.VerticalResolution);

        using (Graphics graphics = Graphics.FromImage(toReturn))
        {
            graphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
            graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
            graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
            graphics.DrawImage(sourceImage, 0, 0, destWidth, destHeight);
        }
        return toReturn;
    }
Run Code Online (Sandbox Code Playgroud)

但是我对调整大小的图像有一个很大的问题:它们有灰色和黑色边框,制作没有图像的图像非常重要.

它们为什么出现以及我能做些什么使它们消失?

样本输出:

样本输出

.net c# scaling image

12
推荐指数
5
解决办法
1万
查看次数

InterpolationMode HighQualityBicubic在调整大小的图像边缘引入人工制品

使用一些漂亮的标准C#代码来调整图像大小,并将其放在彩色背景上

Image imgToResize = Image.FromFile(@"Dejeuner.jpg");
Size size = new Size(768, 1024);
Bitmap b = new Bitmap(size.Width, size.Height);

Graphics g = Graphics.FromImage((Image)b);
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.FillRectangle(Brushes.Green, 0, 0, size.Width, size.Height);

g.DrawImage(imgToResize, new Rectangle(0,150,768, 570));
b.Save("sized_HighQualityBicubic.jpg");
Run Code Online (Sandbox Code Playgroud)

结果在第0和第1列像素中有一个有趣的人工制品.第0列似乎与背景颜色混合,第1列变浅.

看到左上角放大了高质量的双三次和双三次.

HighQualityBicubic

双立方

..和HighQualityBilinear

HighQualityBilinear

这个论坛帖子似乎是有同样问题的人:具有锋利边缘的DrawImage

听起来像是我的错误?我可以理解为什么颜色会在调整大小的图像的顶部混合.但混合左/右边缘的颜色没有意义.有谁知道防止这些文物的修复?

更新:这里的评论非常相似:GDI + InterpolationMode

c# graphics system.drawing

10
推荐指数
2
解决办法
1万
查看次数

调整大小后白色图像获得灰色边框

我正在搜索谷歌的某种解决方案,我发现了一个,我试图在我的代码中实现它,但它不起作用.问题是,在调整白色图像大小后,它们会变成灰色边框.

这是我找到的soloution的链接:

它说: 这个问题正在发生,因为你正在将图像数据内插到一个新的大小,但是沿着边缘没有要插值的像素,并且.NET默认使用这些边缘的黑色像素.要解决此问题,您需要在DrawImage调用中使用ImageAttributes类....

https://groups.google.com/group/microsoft.public.dotnet.framework.drawing/browse_thread/thread/d834851b49274fd9/81a4fd43694457ac?hl=en&lnk=st&q=DrawImage+resized+border#81a4fd43694457ac

代码1:这是我的代码实现ImageAttributes:

Private Shared Function ResizeImageFile(ByVal imageFile As Byte(), ByVal targetSize As Integer) As Byte()

    Using oldImage As System.Drawing.Image = System.Drawing.Image.FromStream(New MemoryStream(imageFile))

        Dim newSize As Size = CalculateDimensions(oldImage.Size, targetSize)

        Using newImage As New Bitmap(newSize.Width, newSize.Height, PixelFormat.Format32bppRgb)

            Using canvas As Graphics = Graphics.FromImage(newImage)

                Using ia As New ImageAttributes

                    ia.SetWrapMode(Drawing2D.WrapMode.TileFlipXY)
                    canvas.SmoothingMode = SmoothingMode.AntiAlias
                    canvas.InterpolationMode = InterpolationMode.HighQualityBicubic
                    canvas.PixelOffsetMode = PixelOffsetMode.HighQuality
                    canvas.DrawImage(oldImage, New Rectangle(New Point(0, 0), newSize), 0, 0, newImage.Width, newImage.Height, GraphicsUnit.Pixel, ia)

                    Dim m As New MemoryStream()

                    newImage.Save(m, ImageFormat.Png) …
Run Code Online (Sandbox Code Playgroud)

vb.net asp.net resize image

5
推荐指数
1
解决办法
2573
查看次数