标签: gdi+

如何阅读屏幕像素的颜色

好的,我正在寻找能够读取显示器上某个像素颜色的功能或其他功能,当检测到该颜色时,将启用另一个功能.我想用RGB.所有帮助赞赏.谢谢.

c# gdi+ pixel winforms

39
推荐指数
5
解决办法
7万
查看次数

C# - 用于Windows窗体应用程序的BitPps的SetPixel和GetPixel的更快替代品

我正在尝试自学C#,并从各种来源听说函数get和setpixel可能非常慢.有哪些替代方案,性能改进真的那么重要吗?提前致谢!

我的一大块代码供参考:

public static Bitmap Paint(Bitmap _b, Color f)
{
  Bitmap b = new Bitmap(_b);
  for (int x = 0; x < b.Width; x++) 
  {
    for (int y = 0; y < b.Height; y++) 
    {
      Color c = b.GetPixel(x, y);
      b.SetPixel(x, y, Color.FromArgb(c.A, f.R, f.G, f.B));
    }
  }
  return b;
}
Run Code Online (Sandbox Code Playgroud)

c# drawing gdi+ getpixel

37
推荐指数
3
解决办法
5万
查看次数

你能用C#做一个alpha透明的PNG吗?

我有一个显示垂直文本的多浏览器页面.

作为一个丑陋的黑客,让文本在所有浏览器中垂直渲染我创建了一个自定义页面处理程序,它返回一个垂直绘制文本的PNG.

这是我的基本代码(C#3,但对其他任何版本的细微更改为1):

Font f = GetSystemConfiguredFont();
//this sets the text to be rotated 90deg clockwise (i.e. down)
StringFormat stringFormat = new StringFormat { FormatFlags = StringFormatFlags.DirectionVertical };

SizeF size;
// creates 1Kx1K image buffer and uses it to find out how bit the image needs to be to fit the text
using ( Image imageg = (Image) new Bitmap( 1000, 1000 ) )
    size = Graphics.FromImage( imageg ).
        MeasureString( text, f, 25, stringFormat );

using ( Bitmap image = …
Run Code Online (Sandbox Code Playgroud)

.net c# gdi+

34
推荐指数
4
解决办法
4万
查看次数

Image.Save()用于jpeg文件的质量等级是多少?

当我加载一个jpg文件然后转过来并以100的质量保存它并且大小几乎是原始的4倍时,我才真正感到惊讶.为了进一步研究我打开并保存而没有明确设置质量和文件大小完全相同.我认为这是因为没有改变所以它只是将完全相同的位写回文件.为了测试这个假设,我在图像上对角线画了一条大胖线并再次保存而没有设置质量(这次我希望文件跳起来因为它会"脏")但它减少了~10Kb!

此时我真的不明白当我简单地调用Image.Save()时指出压缩质量时发生了什么.当我将质量设置为100(基本上没有压缩)时文件大小比原始大几倍时,文件大小如何接近(在图像修改后)到原始大小时尚未设置质量?

我已经阅读了有关Image.Save()的文档,而且它缺乏关于幕后发生的事情的任何细节.我用谷歌搜索了我能想到的每一种方式,但我找不到任何可以解释我所看到的信息的其他信息.我已经连续工作了31个小时,所以也许我错过了一些明显的东西; 0)

所有这些都是在我实现一些库方法将图像保存到数据库时实现的.我已经重载了我们的"SaveImage"方法以允许明确地设置质量,并且在我的测试期间,我遇到了上面解释的奇怪(对我而言)的结果.任何你可以流下的光都将受到赞赏.

这里有一些代码可以说明我遇到的情况:

string filename = @"C:\temp\image testing\hh.jpg";
string destPath = @"C:\temp\image testing\";

using(Image image = Image.FromFile(filename))
{
    ImageCodecInfo codecInfo = ImageUtils.GetEncoderInfo(ImageFormat.Jpeg);

    //  Set the quality
    EncoderParameters parameters = new EncoderParameters(1);

    // Quality: 10
    parameters.Param[0] = new EncoderParameter(
        System.Drawing.Imaging.Encoder.Quality, 10L);
    image.Save(destPath + "10.jpg", codecInfo, parameters);

    // Quality: 75
    parameters.Param[0] = new EncoderParameter(
        System.Drawing.Imaging.Encoder.Quality, 75L);
    image.Save(destPath + "75.jpg", codecInfo, parameters);

    // Quality: 100
    parameters.Param[0] = new EncoderParameter(
        System.Drawing.Imaging.Encoder.Quality, 100L);
    image.Save(destPath + "100.jpg", codecInfo, parameters);

    //  default
    image.Save(destPath + …
Run Code Online (Sandbox Code Playgroud)

c# gdi+ system.drawing.imaging

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

用于ASP.NET的System.Drawing的替代方案?

经过几天跟踪奇怪的GDI +错误,我偶然发现了MSDN上的这个小宝石:

System.Drawing命名空间中的类不支持在Windows或ASP.NET服务中使用.尝试在其中一种应用程序类型中使用这些类可能会产生意外问题,例如服务性能下降和运行时异常.

我不知道"ASP.NET服务"在这种情况下是否意味着"Web应用程序",但"服务性能降低"当然似乎涵盖了"GDI +中出现一般性错误"和"内存不足"错误的随机分类我的应用程序正在抛出 - 读取和写入JPEG图像的间歇性,不可重现的错误 - 在许多情况下 - 实际上是由System.Drawing.Imaging首先创建的.

那么 - 如果GDI +无法在Web应用程序中可靠地读取和写入JPEG文件,那么我应该使用什么呢?

我希望用户能够上传图像(需要JPEG,其他格式很好),可靠地重新采样,并在出现任何问题时显示有用的错误消息.有任何想法吗?WPF的System.Media命名空间值得考虑吗?

编辑:是的,我知道GDI +"大部分时间都在工作".这还不够好,因为当它失败时,它会以一种无法隔离或优雅地恢复的方式这样做.我对适合您的GDI +代码示例不感兴趣:我正在寻找用于图像处理的替代库.

c# asp.net system.drawing gdi+ system.drawing.imaging

32
推荐指数
4
解决办法
1万
查看次数

InvalidOperationException - 对象当前正在其他地方使用 - 红叉

我有一个C#桌面应用程序,其中我创建的一个线程不断从源(实际上是数码相机)获取图像并将其放在GUI中的面板(panel.Image = img)上(必须是另一个线程)它是控件的代码隐藏.

应用程序工作,但在某些机器上,我随机的时间间隔得到以下错误(不可预测)

************** Exception Text **************
System.InvalidOperationException: The object is currently in use elsewhere. 
Run Code Online (Sandbox Code Playgroud)

然后面板变成红十字,红色X - 我认为这是可以从属性中编辑的无效图片图标.应用程序继续工作,但面板永远不会更新.

据我所知,这个错误来自控件的onpaint事件,我在图片上绘制了其他内容.

我尝试使用锁但没有运气:(

我调用将图像放在面板上的函数的方式如下:

if (this.ReceivedFrame != null)
{
    Delegate[] clients = this.ReceivedFrame.GetInvocationList();
    foreach (Delegate del in clients)
    {
        try
        {
            del.DynamicInvoke(new object[] { this, 
                new StreamEventArgs(frame)} );
        }
        catch { }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是代表:

public delegate void ReceivedFrameEventHandler(object sender, StreamEventArgs e);
    public event ReceivedFrameEventHandler ReceivedFrame;
Run Code Online (Sandbox Code Playgroud)

这就是控制代码隐藏中的函数如何注册到它:

Camera.ReceivedFrame += 
    new Camera.ReceivedFrameEventHandler(camera_ReceivedFrame);
Run Code Online (Sandbox Code Playgroud)

我也试过了

del.Method.Invoke(del.Target, new object[] { this, new StreamEventArgs(b) });
Run Code Online (Sandbox Code Playgroud)

代替

del.DynamicInvoke(new …
Run Code Online (Sandbox Code Playgroud)

c# multithreading gdi+ invalidoperationexception winforms

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

Windows Aero:要绘制什么颜色的"玻璃"?

我必须在客户区涂上什么颜色才能制作玻璃

我使用以下方法将表单框架扩展到客户区:

DwmExtendFrameIntoClientArea(self.Handle, margins);
Run Code Online (Sandbox Code Playgroud)

我找不到微软的官方文档,说明DWM用玻璃代替什么颜色和/或alpha.DwmExtendFrameInClientArea上的文档甚至没有提到需要自定义颜色.只有传闻和神话,甚至需要特殊的颜色.

我能找到的最接近的是MSDN上的主题:

使用DWM的自定义窗口框架

为了使扩展帧可见,每个扩展帧的边下面的区域必须具有alpha值为0的像素数据.

更新:和博客文章:

Windows Vista for Developers - 第3部分 - 桌面窗口管理器

碰巧RGB黑色(0x00000000)的位模式与100%透明ARGB的位模式相同,因此您可以使用"黑色"GDI画笔实际绘制并假设您已指示DWM模糊绘制区域,结果将是所需的玻璃效果.

如果我按照他们的字面意思(alpha值为零的像素数据),我构造一个零alpha的颜色,并在扩展区域绘制:

Color fillColor = Color.FromArgb(0, 0, 0, 0); //(a, r, g, b)
e.Graphics.FillRectangle(new SolidBrush(fillColor), e.ClipRectangle);
Run Code Online (Sandbox Code Playgroud)

但玻璃效果没有出现:

替代文字http://i46.tinypic.com/anlmd4.png


如果我忽略引用的MSDN主题,而是使用完全不透明的黑色(而不是完全透明的黑色):

Color fillColor = Color.FromArgb(255, 0, 0, 0); //(a, r, g, b)
e.Graphics.FillRectangle(new SolidBrush(fillColor), e.ClipRectangle);
Run Code Online (Sandbox Code Playgroud)

玻璃效果确实出现了:

alt text http://i45.tinypic.com/2ug2ias.png

然后我开始相信不透明的黑色是DWM用玻璃代替的像素值.

但那我如何在玻璃区域上画黑色物品呢?


我测试过在玻璃区域上画一个黑色矩形,旁边有一个圆圈.奇怪的是,矩形没有出现,而圆圈确实出现; 两者颜色相同:

Brush …
Run Code Online (Sandbox Code Playgroud)

windows gdi+ aero dwm

30
推荐指数
1
解决办法
2876
查看次数

System.Drawing - 在透明像素上使用DrawString进行错误的文本渲染

将文本渲染到位图时,我发现当在具有非不透明alpha的区域上渲染时,文本看起来非常糟糕.随着基础像素变得更加透明,问题逐渐恶化.如果我不得不猜测我会说当底层像素是透明的时,文本渲染器将任何消除锯齿的"灰色"像素绘制为纯黑色.

以下是一些截图:

在透明像素上绘制的文字:

替代文字

在半透明像素上绘制的文字:

替代文字

在不透明像素上绘制的文字:

替代文字

以下是用于呈现文本的代码:

g.SmoothingMode = SmoothingMode.HighQuality;
g.DrawString("Press the spacebar", Font, Brushes.Black, textLeft, textTop);
Run Code Online (Sandbox Code Playgroud)

c# system.drawing gdi+ drawstring winforms

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

Graphics.DrawImage对于更大的图像来说太慢了吗?

我正在制作游戏,我希望有一个带有背景图像的主菜单.

但是,我觉得这个方法Graphics.DrawImage()真的很慢.我做了一些测量.我们假设MenuBackground是我的资源图像,分辨率为800 x 1200像素.我将它绘制到另一个800 x 1200位图上(我首先将所有内容渲染到缓冲区位图,然后我将其缩放并最终将其绘制到屏幕上 - 这就是我如何处理多个玩家分辨率的可能性.但它不应该影响它以任何方式,见下一段).

所以我测量了以下代码:

Stopwatch SW = new Stopwatch();
SW.Start();

// First let's render background image into original-sized bitmap:

OriginalRenderGraphics.DrawImage(Properties.Resources.MenuBackground,
   new Rectangle(0, 0, Globals.OriginalScreenWidth, Globals.OriginalScreenHeight));

SW.Stop();
System.Windows.Forms.MessageBox.Show(SW.ElapsedMilliseconds + " milliseconds");
Run Code Online (Sandbox Code Playgroud)

结果让我感到惊讶 - Stopwatch两者之间的措施40 - 50 milliseconds.并且因为背景图像不是唯一要绘制的东西,所以整个菜单需要大约100毫秒才能显示,这意味着可观察到的延迟.

我试图将它绘制到Paint事件给出的Graphics对象,但结果是30 - 40 milliseconds- 没有太大的改变.

那么,这是否意味着,这Graphics.DrawImage()对于绘制更大的图像是不可用的?如果是这样,我该怎么做才能提高游戏性能?

c# gdi+ image c#-4.0

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

如何在保存图像时找到Generic GDI +错误的原因?

拥有一个在加载和存储图像时可以使用多年的代码,我发现我有一个图像打破了这段代码:

const string i1Path = @"c:\my\i1.jpg";
const string i2Path = @"c:\my\i2.jpg";

var i = Image.FromFile(i1Path);
i.Save(i2Path, ImageFormat.Jpeg);
Run Code Online (Sandbox Code Playgroud)

例外是:

发生了System.Runtime.InteropServices.ExternalException

GDI +中发生了一般错误.

at System.Drawing.Image.Save(String filename,ImageCodecInfo encoder,EncoderParameters encoderParams)
at System.Drawing.Image.Save(String filename,ImageFormat format)
at ...

据我所知,图像没什么特别之处.它的大小约为250像素,可以在Windows Image Viewer或Paint.NET中打开:

在此输入图像描述

(由于上面的图片,上传到Stack Overflow后不再产生错误,我把原始图像放在这里)

我发现在调用Save方法时,目标图像文件是用零字节创建的.

我真的对导致错误的原因一无所知.

我的问题:

  • 你能想到任何阻碍.NET保存图像的特殊事物吗?
  • 有没有办法(除了惊慌失措)缩小这些错误?

.net c# system.drawing gdi+ image

29
推荐指数
4
解决办法
8万
查看次数