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

2024-02-08

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

这是我找到的解决方案的链接:

It says:出现此问题的原因是您将图像数据插值到 新尺寸,但沿边缘没有可插入的像素,.NET 默认情况下,这些边缘使用黑色像素。要解决这个问题,您需要使用 您的 DrawImage 调用中的 ImageAttributes 类......

代码 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)
                    Return m.GetBuffer()

                End Using

            End Using

        End Using

    End Using

End Function

Private Shared Function CalculateDimensions(ByVal oldSize As Size, ByVal targetSize As Integer) As Size

    Dim newSize As New Size()

    If oldSize.Height > oldSize.Width Then

        newSize.Width = CInt((oldSize.Width * (CSng(targetSize) / CSng(oldSize.Height))))
        newSize.Height = targetSize

    Else

        newSize.Width = targetSize
        newSize.Height = CInt((oldSize.Height * (CSng(targetSize) / CSng(oldSize.Width))))

    End If

    Return newSize

End Function

代码 2:导致白色图像出现灰色边框的代码

这是调整大小后的图像:

新图像尺寸宽度 = 400px

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)

                    canvas.SmoothingMode = SmoothingMode.AntiAlias
                    canvas.InterpolationMode = InterpolationMode.HighQualityBicubic
                    canvas.PixelOffsetMode = PixelOffsetMode.HighQuality
                    canvas.DrawImage(oldImage, New Rectangle(New Point(0, 0), newSize))

                    Dim m As New MemoryStream()

                    newImage.Save(m, ImageFormat.Png)
                    Return m.GetBuffer()

            End Using

        End Using

    End Using

End Function

Private Shared Function CalculateDimensions(ByVal oldSize As Size, ByVal targetSize As Integer) As Size

    Dim newSize As New Size()

    If oldSize.Height > oldSize.Width Then

        newSize.Width = CInt((oldSize.Width * (CSng(targetSize) / CSng(oldSize.Height))))
        newSize.Height = targetSize

    Else

        newSize.Width = targetSize
        newSize.Height = CInt((oldSize.Height * (CSng(targetSize) / CSng(oldSize.Width))))

    End If

    Return newSize

End Function

2011 年 7 月 30 日更新:

代码1解决了白色图像上灰色边框的问题,但是有新问题。问题出在这行代码中:

canvas.DrawImage(oldImage, 新矩形(新点(0, 0), newSize), 0, 0, newImage.Width, newImage.Height, GraphicsUnit.Pixel, ia)

使用此代码,我得到具有所需宽度和高度且没有灰色边框的输出图像,但 oldImage 未缩放。

例如:

如果我想上传、调整大小并保存原始尺寸为 640x480px 且目标尺寸为 400px 的图像。作为输出,我得到一个宽度:400px,高度:300px,没有灰色边框的图像,但 oldImage 没有调整大小/缩放到 400px。这样,oldImage 就以原始分辨率绘制了。如何缩放oldImage才能正确绘制?有人可以指出我正确的解决方案或修改代码吗?

感谢大家,但我找到了解决所有问题的方法。

代码 1没有正常工作因为下面这行代码:

canvas.DrawImage(oldImage, 新矩形(新点(0, 0), newSize), 0, 0, newImage.Width, newImage.Height, GraphicsUnit.Pixel, ia)

解决方案:

canvas.DrawImage(oldImage, 新矩形(新点(0, 0), newSize), 0, 0,旧图像的宽度, 旧图像.高度, GraphicsUnit.Pixel, ia)

这是完整的工作代码(调整图像大小,没有灰色/黑色边框):

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, oldImage.Width, oldImage.Height, GraphicsUnit.Pixel, ia)

                    Dim m As New MemoryStream()

                    newImage.Save(m, ImageFormat.Png)
                    Return m.GetBuffer()

                End Using

            End Using

        End Using

    End Using

End Function

Private Shared Function CalculateDimensions(ByVal oldSize As Size, ByVal targetSize As Integer) As Size

    Dim newSize As New Size()

    If oldSize.Height > oldSize.Width Then

        newSize.Width = CInt((oldSize.Width * (CSng(targetSize) / CSng(oldSize.Height))))
        newSize.Height = targetSize

    Else

        newSize.Width = targetSize
        newSize.Height = CInt((oldSize.Height * (CSng(targetSize) / CSng(oldSize.Width))))

    End If

    Return newSize

End Function

这是我拥有的类中的一个函数,您必须替换一些类属性(ThumbNail Size.Width,ThumbNail Size.Height):

public void ResizeImage(HttpPostedFile fil, string sPhysicalPath, 
                              string sOrgFileName,string sThumbNailFileName,
                              ImageFormat oFormat, int rez)
{

    try
    {

        System.Drawing.Image oImg = System.Drawing.Image.FromStream(fil.InputStream);

        decimal pixtosubstract = 0;
        decimal percentage;

        //default
        Size ThumbNailSizeToUse = new Size();
        if (ThumbNailSize.Width < oImg.Size.Width || ThumbNailSize.Height < oImg.Size.Height)
        {
            if (oImg.Size.Width > oImg.Size.Height)
            {
                percentage = (((decimal)oImg.Size.Width - (decimal)ThumbNailSize.Width) / (decimal)oImg.Size.Width);
                pixtosubstract = percentage * oImg.Size.Height;
                ThumbNailSizeToUse.Width = ThumbNailSize.Width;
                ThumbNailSizeToUse.Height = oImg.Size.Height - (int)pixtosubstract;
            }
            else
            {
                percentage = (((decimal)oImg.Size.Height - (decimal)ThumbNailSize.Height) / (decimal)oImg.Size.Height);
                pixtosubstract = percentage * (decimal)oImg.Size.Width;
                ThumbNailSizeToUse.Height = ThumbNailSize.Height;
                ThumbNailSizeToUse.Width = oImg.Size.Width - (int)pixtosubstract;
            }

        }
        else
        {
            ThumbNailSizeToUse.Width = oImg.Size.Width;
            ThumbNailSizeToUse.Height = oImg.Size.Height;
        }

        Bitmap bmp = new Bitmap(ThumbNailSizeToUse.Width, ThumbNailSizeToUse.Height);
        bmp.SetResolution(rez, rez);
        System.Drawing.Image oThumbNail = bmp;

        bmp = null;

        Graphics oGraphic = Graphics.FromImage(oThumbNail);

        oGraphic.CompositingQuality = CompositingQuality.HighQuality;

        oGraphic.SmoothingMode = SmoothingMode.HighQuality;

        oGraphic.InterpolationMode = InterpolationMode.HighQualityBicubic;

        Rectangle oRectangle = new Rectangle(0, 0, ThumbNailSizeToUse.Width, ThumbNailSizeToUse.Height);

        oGraphic.DrawImage(oImg, oRectangle);

        oThumbNail.Save(sPhysicalPath  + sThumbNailFileName, oFormat);

        oImg.Dispose();

    }
    catch (Exception ex)
    {
        Response.Write(ex.Message);
    }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

调整白色图像大小后获得灰色边框 的相关文章

  • 对齐 GridView 中的行值

    我需要在 asp net 3 5 中右对齐 gridview 列中的值 我怎样才能做到这一点
  • App_Data 文件夹内的数据库与连接到 SQL Server 的数据库有什么区别?

    我是 NET 新手 在开始学习 ASP NET MVC2 框架时 我发现您可以在 App Data 文件夹中创建一个 mdf 文件并连接到它 或者您可以连接到 SQL Server 这些与数据库交互的方法有什么区别 一种相对于另一种的优点
  • VB.NET vNext 中的迭代器以及 C# 中迭代​​器的限制

    我刚刚在上看到异步CTP网站 http msdn microsoft com en us vstudio async aspxVB NET 的下一个版本将有迭代器 我猜它们包含了迭代器 因为重写过程与新的迭代器所使用的过程类似 async
  • 使用 JSON.net 反序列化

    我对 json JSON net 等都很陌生 在这里阅读类似的问题后 我无法让我的代码工作 我的错误到底是什么 我监督了什么 出于测试目的是否可以跳过 链接 和 元 类 或者我是否必须定义每个属性 我得到以下 REST 输出 codes h
  • 更改组合框下拉列表边框的颜色

    My code Private Sub ComboBox2 DrawItem sender As Object e As DrawItemEventArgs Handles ComboBox2 DrawItem If e Index lt
  • 如何以编程方式将多个 JPEG 合并为无损 wav 中的更大 JPEG (.net)

    我有几张 JPEG 图像 我想将它们组合成一张大 JPEG 图像 我可以通过创建一个来做到这一点Bitmap然后将它们组合在一起 但这样如果我再次将其保存为 JPEG 图像将会恶化 那么 有没有什么方法可以在解码 编码时在不损失质量的情况下
  • 正确的标头 php mysql blob 显示图像

    我正在尝试在我的 PHP 页面中显示来自 mysql blob 的图像 我知道这不是最佳实践 然后我会将其引入我的 iOS 应用程序中 我在设置页面标题时遇到问题 我认为需要将其设置为图像 所以 这显示了图像 但我不相信页眉是正确的 hea
  • 运行代码隐藏的表行 onclick 事件

    我继承了一个 ASP NET 项目 该项目的 HTML 设计很糟糕 在一个部分中 tr 标签用标签包裹起来 以允许 单击该行查看信息 功能 代码是 tr
  • SVG 转 JPG / PNG

    有没有工作模块可以convert a SVG image into像素格式如JPEG or PNG 看看蜡染工具包 具体来说是光栅化器 http xmlgraphics apache org batik tools rasterizer h
  • 锁定 ASP.NET 应用程序变量

    我在 ASP NET 应用程序中使用第三方 Web 服务 对第 3 方 Web 服务的调用必须同步 但 ASP NET 显然是多线程的 并且可能会发出多个页面请求 从而导致对第 3 方 Web 服务的同时调用 对 Web 服务的调用封装在自
  • 将日期时间转换为指定格式

    我有这个日期格式yy MM dd HH mm ss ex 12 02 21 10 56 09 问题是 当我尝试使用以下代码将其转换为不同格式时 CDate 12 02 21 10 56 09 ToString MMM dd yyyy HH
  • Visual Studio:如何将图像资源存储为嵌入式资源?

    默认情况下 当您将图像 图标 位图等 作为资源添加到项目中时 该图像的构建行动被设定为None 这样做是因为图像神奇地存储在 resources 文件中 I希望将资源存储为嵌入式资源 我的原因无关紧要 但让我们假装这样我可以在里面看到它们R
  • 需要将用户名和密码添加到 VB.NET Web 服务客户端中的 SOAP 标头

    我需要查询一个进行基本身份验证的 Web 服务 将用户名和密码放在请求标头中 我的客户端是用 VB NET Visual Basic Express Edition 2010 编写的 我已将 Web 服务添加到服务引用中 它为我自动生成了合
  • VB.NET 中的类型比较

    如何比较 VB NET 中的类型数据类型 我的代码 Private Function Equal ByVal parameter As String ByVal paramenterName As String ByVal dataType
  • asp.net datalist 选择每个类别的所有复选框

    我有一个页面 用户可以在数据列表控件中选择不同的文档文件 使用预渲染事件处理程序根据类别对文档进行分类 文档是根据复选框控件 而不是复选框列表 选择的 到目前为止 一切都很好 接下来我想要发生的事情是在每个类别名称旁边放置一个 全选 复选框
  • 自定义模板化 ASP.NET 控件的双向数据绑定

    这个问题最初是关于让双向绑定工作的 但由于缺乏具体的答案和其他方面的进展 我一直在更新它 你可以检查编辑历史记录 但我认为这对于明晰 下面列出的代码允许将单个对象双向数据绑定到模板化控件 我想以最简单的方式扩展此示例 以允许针对最根对象的复
  • 使用来自另一个 ASP.NET 应用程序的 DNN 身份验证和授权信息

    我有一个 ASP NET Web 应用程序 K 它有自己的基于 SimpleMembershipProvider 的身份验证和授权 现在我想建立一个具有应用程序 K 和 DNN 的网站 用户将登录到 DNN 应用程序 并且我在 DNN 应用
  • ASP.NET MVC4 与 Twitter Bootstrap 捆绑

    我正在尝试将 MVC 4 中的新捆绑功能与 Twitter bootstrap 结合使用 在我看来 css 中的字形 png 文件的路径在某种程度上被搞乱了 这是我的代码 bundles Add new StyleBundle bundle
  • App_offline.htm、CSS、图像和 aspnet_isapi.dll

    因此 我正在开发的网站正在使用 urlrewriting 与 aspnet isapi dll 配合 所有内容都映射到它 我放置了 app offline htm 文件 所有文本均显示 但是 CSS 或图像未提供 我猜测由于通配符映射而不是
  • 重叠的回收和Application_Start

    我有一个使用 AppFabric 进行分布式缓存的 asp net Web 应用程序 在 Application Start 上 我初始化与 AppFabric 的连接 这通常需要几毫秒 这是完全可以接受的 有时可能需要长达30秒连接 在回

随机推荐

  • Clojure STM 歧义因子

    在 Clojure 中 我们使用 STM 来实现并发 我的问题是STM使用数据的时间点值 这是否会带来歧义 我们如何知道访问了什么值 Clojure 中的 STM 提供 通过ref http clojure org refss and do
  • 命名空间中所需的 WSDL 扩展元素“绑定”

    我的网络服务遇到了很大的问题 当我尝试通过 svcutil 生成文件时 收到以下错误消息 Attempting to download metadata from http srv 13208 GROUPING WS ASMX as mx
  • VS Web Essentials 2012 在导入保存时编译主 LESS

    我正在尝试维护一个全局 less 文件 该文件 imports 应用程序的其余 less 文件 我目前正在 Visual Studio 2012 中使用 Web Essentials 扩展开发这个项目 该扩展在保存时自动生成 css 文件
  • pip:升级包而不升级特定依赖

    我的问题非常类似于this https stackoverflow com questions 2861183 pip upgrade package without upgrading dependencies问题 但它的不同之处在于 如
  • 如何从 SQL 编写存储过程脚本

    我知道有一种方法可以做到这一点 因为我已经见过它了 我只是不记得怎么做了 我想运行一个 SQL 命令 该命令将返回脚本以创建存储过程作为结果 我怎样才能做到这一点 尝试使用 sp helptext 命令 sp helptext yourpr
  • [UICollectionView setCollectionViewLayout:animated:] 访问错误

    我的 UICollectionView 发生了奇怪的崩溃 崩溃的 UICollectionView 嵌入到另一个 UICollectionView 的 UICollectionView 单元格中 我无法重现这个问题 如果内部 UIColle
  • 在 docker 容器中运行 emacs

    我使用的是 Mac 想在我的 docker 容器中运行 emacs 有解决这个问题的首选方法吗 在我的流程中 我陷入困境 因为未设置显示 术语 gt docker exec it c6a7a76db84c bash gt sudo apt
  • 测试php字符串是否为整数

    post用于模拟 POST 我发现 POST int 是一个字符串 我怎样才能知道是否 post int 是一个整数 下面表明它不是整数 编辑 根据文档 http php net manual en function is int php
  • 如何覆盖 gem 依赖?

    我有 2 个 gem 它们依赖于冲突版本的 hashie 一个需要 gt 1 2 0 另一个需要 3 3 1 Bundler could not find compatible versions for gem hashie In Gemf
  • 如何在多个多面 ggplot2 图形中实现相同的面大小和比例?

    我有一系列ggplot2具有恒定数量的水平面但不同数量的垂直面的图形 我想将图形保存为横向 a4 格式的 pdf 但是 我不知道如何才能实现相同比例的面 如果我尝试手动调整它并改变width and height对于不同数量的垂直面 图之间
  • 正则表达式不允许输入字段中有空格

    我的表单中有一个用户名字段 我不想在字符串中的任何地方允许空格 我已经使用了这个正则表达式 var regexp S 如果字符之间有空格 这对我有用 也就是说 如果用户名是ABC DEF 如果开头有空格 则不起作用 例如
  • 如何设置像 blogspot 这样的子域

    当用户注册我的网站时 应该如何为他们设置子域 需要哪些基础设施 我正在使用 Linux 服务器 您可以使用特定的 DNS CNAME or A AAAA 每个已知子域的条目 或接受 example com 的通配符 DNS 条目 ORIGI
  • Pandas 系列 - 打印列和行

    现在我不太担心在系列中获取数据的最有效方法 假设我的系列如下 A 1 B 2 C 3 D 4 如果我使用 for 循环来迭代它 例如 for row in seriesObj print row 上面的代码将在右侧打印值 但是可以说 我想获
  • 禁用 JTextPane 中的编辑,同时允许可见的光标移动

    我有一个JTextPane它是通过从文件中读取来填充的 然后对数据进行解析和格式化 该用户无权编辑JTextPane 但我希望他们能够使用可见的光标在其中导航 如果我使用setEditable false 光标是不可见的 尽管可以通过按住来
  • 为什么java在eclipse中运行会出现编译时错误

    interface A public void f public void g class B implements A public void f System out println B f public class Main publ
  • 什么时候需要使用 renderer.outputEncoding = THREE.sRGBEncoding

    我是 Three js 的新手 我一直在通过尝试制作简单的场景并了解官方示例的工作原理来学习 Three js 最近我一直在看https trijs org examples q trans webgl materials physical
  • 使用 PHP/MySQL 进行搜索过滤

    我正在尝试在我的献血者应用程序中创建搜索 过滤选项 可以通过性别 姓名 血型或选择全部三项来搜索捐赠者 这是我的代码 function search donar POST by name POST by name by sex POST b
  • 从 chrome 扩展注入的 js 访问全局 js 变量

    我正在尝试创建一个带有侧面板的扩展 此侧面板将包含一些按钮 这些按钮将根据主机页面状态执行操作 我跟着这个例子 https stackoverflow com questions 39610205 how to make side pane
  • 网格的 VBO 不正确:某些三角形已连接且不应连接 [2D]

    我正在用这段代码生成我的VBO int SCREEN WIDTH 800 int SCREEN HEIGHT 480 int PIXEL PER VERTEX 4 int CAVERN TEXTURE WIDTH 1024 int CAVE
  • 调整白色图像大小后获得灰色边框

    我在谷歌上搜索某种解决方案 我找到了一个 我尝试在我的代码中实现它 但它不起作用 问题是 调整白色图像的大小后 它们会得到灰色边框 这是我找到的解决方案的链接 It says 出现此问题的原因是您将图像数据插值到 新尺寸 但沿边缘没有可插入