标签: system.drawing

如何使用System.Drawing绘制透明图像?

我正在尝试从.aspx页面返回透明GIF,以便在网页中显示.我试图让图像具有透明度,但我只是让黑色成为图像应该透明的地方.

有谁知道我做错了什么?

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
  Handles Me.Load
    '' Change the response headers to output a GIF image.
    Response.Clear()
    Response.ContentType = "image/gif"

    Dim width = 110
    Dim height = width

    '' Create a new 32-bit bitmap image
    Dim b = New Bitmap(width, height)

    '' Create Grahpics object for drawing
    Dim g = Graphics.FromImage(b)

    Dim rect = New Rectangle(0, 0, width - 1, height - 1)

    '' Fill in with Transparent
    Dim tbrush = …
Run Code Online (Sandbox Code Playgroud)

asp.net transparency system.drawing gif

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

Bitmap类不配置流?

因此,在发现Bitmap类期望原始流在图像或位图的生命周期内保持打开之后,我决定找出Bitmap类在处理时是否实际关闭了流.

查看源代码,Bitmap和Image类创建一个GPStream实例来包装流,但不存储对GPStream或Stream实例的引用.

num = SafeNativeMethods.Gdip.GdipLoadImageFromStreamICM(new GPStream(stream), out zero);
Run Code Online (Sandbox Code Playgroud)

现在,GPStream类(内部)没有实现Release或Dispose方法 - 什么都不允许GDI关闭或处理流.由于Image/Bitmap类没有保留对GPStream实例的引用,因此GDI,Drawing.Bitmap或Drawing.Stream似乎无法正确关闭流.

我可以继承Bitmap来解决这个问题,但是,等等,它是密封的.

请告诉我,我错了,并且MS不仅无法编写不会泄漏API资源的代码.

请记住(a),Bitmap 没有对流的管理引用,这意味着GC将在它仍在使用时收集它,并且(b).NET API采用位图/图像引用,并且不确定它们何时是完成他们.

.net c# system.drawing gdi+ memory-leaks

11
推荐指数
1
解决办法
3765
查看次数

质量和压缩之间的区别与system.drawing.imaging?

我对ASP.NET中的图像处理完全不熟悉.我非常熟悉Photoshop,并且在某种程度上对图像有所了解.

我试图找出质量和压缩之间的区别,因为其他应用程序倾向于将它们视为相同.使用system.drawing.imaging有质量和压缩的设置.

http://msdn.microsoft.com/en-us/library/system.drawing.imaging.encoder.quality.aspx上写着:"质量类别指定图像的压缩级别."

http://msdn.microsoft.com/en-us/library/bb882583.aspx上写着:"质量等级0对应于最大压缩,质量等级100对应于最低压缩."

文档似乎可以互换地使用质量和压缩.但是,每个都有设置.有什么不同?

c# asp.net system.drawing image-processing system.drawing.imaging

11
推荐指数
1
解决办法
5505
查看次数

向System.Drawings.Color添加颜色选项

在visual studio中,当在标记中创建控件时(或在代码隐藏中),您可以指定HEX格式的颜色,如:"#FFFFFF",但您也可以从预设颜色列表中进行选择,如:白色,小麦,窗口等等(见截图).
是否可以扩展该列表并添加其他颜色?
在此输入图像描述

c# asp.net system.drawing asp.net-4.5 visual-studio-2012

11
推荐指数
3
解决办法
2289
查看次数

OutOfMemoryException:内存不足 - System.Drawing.Graphics.FromImage

使用System.Drawing.Graphics.FromImage(在Windows 2012服务器上使用最新版本的.NET软件)时,我会出现Out of Memory异常,仅限于极少数特定的图像文件.大多数情况下代码工作正常.

上述问题的典型答案表明某些资源尚未发布.

在回答之前请考虑以下事项: -

  • 此特定图像大小为34KB,是.JPG图像.服务器空闲,具有超过32GB的RAM.
  • 如果我查看这个jpg文件的属性,使用Windows资源管理器,通过右键单击文件,Windows说:96 dpi和32位深度.
  • 但是,如果我使用任何图形程序(例如photoshop)打开这个jpg文件,文件属性显示为: 72 dpi和24 bit深度.
  • 因此,我认为文件头属性所说的与文件实际包含的内容之间存在不匹配.
  • 此外,如果我使用图形程序打开jpg文件并且只是重新保存而不更改任何内容,则Windows资源管理器中的文件属性现在匹配/读取正确(72 dpi和24位深度); 并且文件由System.Drawing.Graphics正确处理,不会抛出异常.

由于我对该主题的了解有限,我不知道图像文件的文件头是否可以包含与实际文件内容不同的数据.

问题:

我该如何解决这个问题?或者,我如何告诉System.Drawing.Graphics忽略文件头数据,只看实际的图像文件内容?(因为像Photoshop这样的所有图形程序似乎都可以).

谢谢!

.net c# graphics system.drawing

11
推荐指数
2
解决办法
9868
查看次数

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万
查看次数

如何从C#中的Graphics对象获取位图/图像?

我想知道Graphics对象绘制一些东西的缓冲区的中间状态.如何获取位图或正在绘制的图像?

.net c# graphics system.drawing bitmap

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

在winforms应用程序中缓存GDI +对象:是否值得,如何正确执行?

对于我的一些winforms应用程序,我需要创建一大堆GDI +对象(画笔,笔,字体等)并一遍又一遍地使用它们.我创建了一个贫民窟缓存单身人士来完成我需要的东西,但代码味道压倒性......

public sealed class GraphicsPalette
{
    public static readonly GraphicsPalette Instance = new GraphicsPalette();

    static GraphicsPalette()
    {
    }

    private Dictionary<Color, Brush> solidBrushes;

    //multithreading
    private object brushLock;

    private GraphicsPalette()
    {
        solidBrushes = new Dictionary<Color, Brush>();

        brushLock = new object();
    }

    public Brush GetSolidBrush(Color color, int alpha)
    {
        return GetSolidBrush(Color.FromArgb(alpha, color));
    }

    public Brush GetSolidBrush(Color color)
    {
        if (!solidBrushes.ContainsKey(color))
        {
            lock (brushLock)
            {
                if (!solidBrushes.ContainsKey(color))
                {
                    Brush brush = new SolidBrush(color);
                    solidBrushes.Add(color, brush);
                    return brush;
                }
            }
        }
        return solidBrushes[color];
    } …
Run Code Online (Sandbox Code Playgroud)

.net c# system.drawing gdi+ winforms

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

如何在C#中用鼠标选择PictureBox.Image上的区域

我只想在我的picturebox.image上做一个选择,但这比一些有点烦人的情况变得更糟.我想到了主要图片框上的另一个图片框,但它对我来说似乎很懒散.我需要知道是否有一种方法可以在picturebox.image上创建一个选择区域(它将是半透明的蓝色区域),我将用鼠标绘制它并且它不应该改变我正在处理的图像.

样品:

    // Start Rectangle
    //
    private void pictureBox1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
    {
        // Determine the initial rectangle coordinates...
        RectStartPoint = e.Location;
        Invalidate();
    }

    // Draw Rectangle
    //
    private void pictureBox1_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
    {
        if (e.Button != MouseButtons.Left)
            return;
        Point tempEndPoint = e.Location;
        Rect =
            new Rectangle(
                Math.Min(RectStartPoint.X, tempEndPoint.X),
                Math.Min(RectStartPoint.Y, tempEndPoint.Y),
                Math.Abs(RectStartPoint.X - tempEndPoint.X),
                Math.Abs(RectStartPoint.Y - tempEndPoint.Y));
        Invalidate(Rect);
    }

    // Draw Area
    //
    private void pictureBox1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
    {
        // Draw the rectangle...
        if (pictureBox1.Image != null)
        { …
Run Code Online (Sandbox Code Playgroud)

.net c# system.drawing winforms

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

.Net Color结构是否使用HSB或HSL颜色空间?

据我所知,HSL和HSB颜色空间非常相似,两者都使用相同的0-360色轮作为色调,并使用相同的0-1值进行饱和.它们之间的一个区别是在HSB模型中你有亮度,其中0是黑色,1是全强度的颜色,而在HSL中你有亮度/亮度,其中0仍然是黑色但1是白色.

在.NET Color结构采用RGB空间,但GetHue(),GetSaturation()GetBrightness()功能.

这里的文档令人困惑.用于GetBrightness():

/// <summary>Gets the hue-saturation-brightness (HSB) brightness value for this 
/// System.Drawing.Color structure.</summary>
Run Code Online (Sandbox Code Playgroud)

好吧,这很有意义,.Net似乎正在使用HSB ......

/// <returns>The brightness of this System.Drawing.Color. The brightness ranges 
/// from 0.0 through 1.0, where 0.0 represents black and 1.0 represents white.
/// </returns>
Run Code Online (Sandbox Code Playgroud)

呃......所以最大值代表白色,而不是最亮的颜色.尽管他们的文档和命名始终指的是亮度,但我很确定返回的值实际上是亮度/亮度,即.Net实际上使用HSL模型而不是HSB.

谁能证实这一点?它是文档中的错误GetBrightness(),错误,还是我以某种方式误解了理论?

.net hsl system.drawing hsb color-theory

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