Tag: 位图

Image和Bitmap类都没有实现自定义相等/哈希码逻辑的原因是什么?

从MSDN文档来看,似乎GetHashCode()和Equals()都没有在Bitmap中被覆盖。 它们都没有在Image中被覆盖。 所以这两个类都使用Object的版本只比较引用。 我不太相信所以我决定启动Reflector来检查它。 看来MSDN在这方面是正确的。 那么,为什么MS人员不会实现“比较逻辑”,至少对于Bitmap类来说,有什么特别的原因吗? 我发现它对于Image来说是可以接受的,因为它是一个抽象类,但对于Bitmap类来说并非如此。 我可以看到在很多情况下计算哈希码可能是一个昂贵的操作,但如果它使用某种缓存它就没问题。 想要比较2个位图时,我是否不得不依靠比较每个像素来运行图片? 谢谢

将RGB8 byte 转换为Bitmap

我有来自RGB8格式相机的原始像素数据,我需要转换为Bitmap 。 但是, Bitmap PixelFormat似乎只支持RGB Bitmap PixelFormat和48格式。 我试图使用PixelFormat.Format8bppIndexed ,但图像看起来变色和反转。 public static Bitmap CopyDataToBitmap(byte[] data) { var bmp = new Bitmap(640, 480, PixelFormat.Format8bppIndexed); var bmpData = bmp.LockBits( new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.WriteOnly, bmp.PixelFormat); Marshal.Copy(data, 0, bmpData.Scan0, data.Length); bmp.UnlockBits(bmpData); return bmp; } 有没有其他方法可以正确转换此数据类型?

从位图图像列表中创建.avi文件

我目前正在尝试制作屏幕录像机。 我制作了位图图像列表,并希望将它们放在.avi文件中。 无论如何在C#中做到这一点? 注意:我是新手,所以保持简单

高效处理超宽但不高的位图?

有没有办法创建更多空间/资源有效的位图? 目前我尝试渲染一个文件,大约800px高,但大约720000px宽。 它崩溃了我的应用程序,大概是因为位图的共享内存大小。 我可以更有效地执行此操作,例如直接将其创建为gif,而不是稍后保存它吗? 我尝试从现实世界的阅读中保存一系列线条/矩形,我希望它是每1/100秒1px。

调用WriteableBitmap.WritePixels方法

我试图调用WriteableBitmap.WritePixels方法,但我似乎无法理解参数。 MSDN文章非常沉闷(或者说我说… null?),我无法理解如何使用该方法。 编辑:我尝试修改本文中的代码: http : //msdn.microsoft.com/en-us/library/system.windows.media.imaging.writeablebitmap%28v=VS.90%29.aspx PixelFormat pf = PixelFormats.Rgba128Float; WriteableBitmap wb = new WriteableBitmap(width * 5, height * 5, 100, 100, pf, new BitmapPalette(new List { Color.FromArgb(255, 255, 0, 0) })); byte[] ColorData = { 0, 0, 0, 0 }; wb.WritePixels(new Int32Rect(0, 0, 1, 1), ColorData, 4, 0); Background.Source = wb; 在最后一行之前的行中,调试器声称缓冲区(ColorData)大小不足。 Edit2:我再试一次: […]

c#截取特定区域的截图

我知道有很多这样的问题,但他们的答案都没有对我有用,或者我无法正确地做到,无论如何,如果有可能请给我一个简单的代码! 我知道绿点的位置,我想根据这个位置构建一个矩形。 例: 最重要的是如何拍摄这个区域的截图? 我不知道如何更改此代码以适用于我的情况。 private Bitmap Screenshot() { Bitmap bmpScreenshot = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height); Graphics g = Graphics.FromImage(bmpScreenshot); g.CopyFromScreen(0, 0, 0, 0, Screen.PrimaryScreen.Bounds.Size); return bmpScreenshot; }

Bitmap.Save(Stream,ImageFormat)如何格式化数据?

我有一个非透明的彩色位图,长度为2480,宽度为3507。 使用Bitmap.GetPixel(int x, int y)我能够获得位图中每个像素的颜色信息。 如果我将位图喷射到byte []: MemoryStream ms = new MemoryStream(); bmp.Save(ms, ImageFormat.Bmp); ms.Position = 0; byte[] bytes = ms.ToArray(); 然后我希望有相同的信息,即我可以转到字节[1000]并读取该像素的颜色信息。 事实certificate,我的字节数组比我预期的要大。 我以为我会得到一个2480 x 3507 = 8697360元素的数组。 相反,我得到一个包含8698438个元素的数组 – 我认为是某种标题。 我的数组中的字节以什么格式存储? 是否有一个1078字节长的标题,后跟每个字节元素的Alpha,Red,Green,Blue值,还是其他什么? 我只需要每个像素的颜色信息。 我不关心标题(或确实是透明度),除非我需要它来获取颜色信息。

C# – 查找图像的边界(不是大小)

我正在开发一个应用程序来均匀地分割图像网格并使图像居中(基于它们的相似性)。 到目前为止,我可以设法修复一个小尺寸的图像网格,但每当我尝试更大的“精灵”大小(例如100×100)时,我就会出现Stack Overflow错误。 是的我正在使用递归,但每当检查一个像素时,我设置一个布尔值来停用它,将它复制到一个列表并继续检查其他(在所有方向),直到列表填满了来自网格。 我不确定这是否是最佳方式,因为对于每次调用,我调用相同的方法7次(假设有7个相邻的像素尚未检查)…直到没有剩余的像素来检查,并且我可以转到网格中的下一个图像。 我尝试跟踪错误开始发生的地方,检查了大约1600像素并将它们添加到列表中。 MyPixel是一个包含4个变量的类:x(int),y(int),color(Color)和checked(bool) public void processSprite(int i, int j) { //OOO //OXO //OOO pixeltemp.Add(new MyPixel(imap.pixels[i, j].x, imap.pixels[i, j].y, imap.pixels[i, j].color)); imap.pixels[i, j].read = true; //OOO //OOX //OOO try { if (!imap.pixels[i + 1, j].read) { if (imap.pixels[i + 1, j].color.A == 0) //Found a Border { imap.pixels[i + 1, j].read = […]

将HBitmap转换为保留alpha通道的位图

我一直在Google和Stack Overflow中搜索,但我找不到一个有效的例子。 我需要将HBitmap转换为Managed .NET位图,但以下代码不保留alpha通道 。 private static Bitmap GetBitmapFromHBitmap(IntPtr nativeHBitmap) { Bitmap bmp = Bitmap.FromHbitmap(nativeHBitmap); return bmp; } 我在SO中找到了这个答案 ,但它对我不起作用,这个例子保留了透明度,但它将我的图像在Y轴上翻转180º并将其旋转180º。 我不知道为什么。 这个其他例子似乎有效,但它是C ++ 有人在C#中工作,非常重要,没有内存泄漏? 提前致谢。 编辑 :关于@Hans Passant的评论,我使用以下代码获取HBitmap(它是一个shell调用,用于从操作系统获取缩略图或图标(仅限Vista和Win7)。 private static IntPtr GetHBitmap(string fileName, int width, int height, ThumbnailOptions options) { IShellItem nativeShellItem; Guid shellItem2Guid = new Guid(IShellItem2Guid); int retCode = SHCreateItemFromParsingName(fileName, IntPtr.Zero, ref shellItem2Guid, out […]

BitmapFactory.DecodeByteArray导致Grow Heap(frag case)

我正在开发Xamarin的Android应用程序。 我在从字节流生成图像时遇到问题。 BitmapFactory(这似乎是最流行的解决方案)正在造成巨大的分配问题 – Grow Heap。 ConnectToDb connect = new ConnectToDb (); byte[] arr = connect.SelectImgByte(3,”Thea”); BitmapFactory.Options options=new BitmapFactory.Options(); options.InJustDecodeBounds = true; bmp = BitmapFactory.DecodeByteArray (arr, 0, arr.Length/*,options*/); _imageView.SetImageBitmap (bmp); 以上是调用BitmapFactory.DecodeByteArray的方法。 它工作正常,显示图像。 但它很慢并导致这些“警告”。 Thread started: #6 [dalvikvm-heap] Grow heap (frag case) to 22.596MB for 1997584-byte allocation [Choreographer] Skipped 129 frames! The application may be doing […]