我正在尝试从.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) 因此,在发现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资源的代码.
我对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
在visual studio中,当在标记中创建控件时(或在代码隐藏中),您可以指定HEX格式的颜色,如:"#FFFFFF",但您也可以从预设颜色列表中进行选择,如:白色,小麦,窗口等等(见截图).
是否可以扩展该列表并添加其他颜色?

使用System.Drawing.Graphics.FromImage(在Windows 2012服务器上使用最新版本的.NET软件)时,我会出现Out of Memory异常,仅限于极少数特定的图像文件.大多数情况下代码工作正常.
上述问题的典型答案表明某些资源尚未发布.
在回答之前请考虑以下事项: -
由于我对该主题的了解有限,我不知道图像文件的文件头是否可以包含与实际文件内容不同的数据.
问题:
我该如何解决这个问题?或者,我如何告诉System.Drawing.Graphics忽略文件头数据,只看实际的图像文件内容?(因为像Photoshop这样的所有图形程序似乎都可以).
谢谢!
使用一些漂亮的标准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列变浅.
看到左上角放大了高质量的双三次和双三次.


..和HighQualityBilinear

这个论坛帖子似乎是有同样问题的人:具有锋利边缘的DrawImage
听起来像是我的错误?我可以理解为什么颜色会在调整大小的图像的顶部混合.但混合左/右边缘的颜色没有意义.有谁知道防止这些文物的修复?
更新:这里的评论非常相似:GDI + InterpolationMode
我想知道Graphics对象绘制一些东西的缓冲区的中间状态.如何获取位图或正在绘制的图像?
对于我的一些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) 我只想在我的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) 据我所知,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(),错误,还是我以某种方式误解了理论?
system.drawing ×10
c# ×8
.net ×6
asp.net ×3
graphics ×3
gdi+ ×2
winforms ×2
asp.net-4.5 ×1
bitmap ×1
color-theory ×1
gif ×1
hsb ×1
hsl ×1
memory-leaks ×1
transparency ×1