Tag: 位图

如何从具有负步幅的位图复制像素数据?

我一直在寻找将Bitmap转换为8bpp的最快方法。 我发现了两种方法: 1。 public static System.Drawing.Image ConvertTo8bpp(Bitmap oldbmp) { using (var ms = new MemoryStream()) { oldbmp.Save(ms, ImageFormat.Gif); ms.Position = 0; return System.Drawing.Image.FromStream(ms); } } 2. http://www.wischik.com/lu/programmer/1bpp.html 但是: 1。结果质量很差(托盘坏) 和2给我一个负步幅的位图,当我尝试锁定位并将数据复制到字节数组时,我得到一个exception: 尝试读取或写入受保护的内存。 这通常表明其他内存已损坏。 BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadWrite, bmp.PixelFormat); this.stride = bmpData.Stride; this.bytesPerPixel = GetBytesPerPixel(bmp.PixelFormat); int length = bmpData.Stride * bmp.Height; if […]

GDI +:将所有像素设置为给定颜色,同时保留现有的alpha值

将System.Drawing.Bitmap中每个像素的RGB分量设置为单一纯色的最佳方法是什么? 如果可能的话,我想避免手动循环每个像素来执行此操作。 注意:我想保留原始位图中的相同alpha分量。 我只想改变RGB值。 我研究了使用ColorMatrix或ColorMap ,但我找不到任何方法可以使用任何一种方法将所有像素设置为特定的给定颜色。

在Bitmap / Image中替换特定颜色的有效方法

在我的灰度图片中,我需要找到特定的值并用一些颜色替换它,例如黄色。 这是我现在的代码,但它并不像我需要的那么快。 有没有更有效的方法来实现这一目标? 我对ColorMatrix类很红,但找不到替换单个值而不影响整个图像的方法。 unsafe { byte stlThres = 115; int bytePerPixel = Image.GetPixelFormatSize(kpImageViewer1.Image.PixelFormat) / 8; var data = kpImageViewer1.Image.LockBits(new Rectangle(0, 0, kpImageViewer1.Image.Width, kpImageViewer1.Image.Height), ImageLockMode.WriteOnly, kpImageViewer1.Image.PixelFormat); for (int y = 0; y < data.Height; y++) { byte* row = (byte*)data.Scan0 + (y * data.Stride); for (int x = 0; x < data.Width; x++, row += […]

更快的算法来改变位图中的色调/饱和度/亮度

我正在尝试过滤位图图像以增加或减少色调,饱和度和亮度值。 我的代码工作得很好,但速度很慢 。 我在内存中锁定了两个位图,原始源和当前目标。 用户可以移动各种轨迹栏控件来修改每个值,然后将其转换为HSL值。 例如,轨迹栏上的值对应于-1.0到1.0的范围。 每次抛出轨道栏值发生变化的事件时,我都会运行一个锁定目标位图的函数,并将HSL值与源位图一起应用,然后将结果存储在目标位图中。 完成后,我解锁目标位图并在屏幕上绘制图像。 以前我使用查找表来处理其他filter,因为我正在进行每字节操作。 但是我不知道如何使用HSL来应用它。 这是我正在使用的代码: byte red, green, blue; for (int i = 0; i < sourceBytes.Length; i += 3) { blue = sourceBytes[i]; green = sourceBytes[i + 1]; red = sourceBytes[i + 2]; Color newColor = Color.FromArgb(red, green, blue); if (ModifyHue) newColor = HSL.ModifyHue(newColor, Hue); if (ModifySaturation) newColor […]

c ++从hbitmap获取原始像素数据

我是一个相当新的使用p / invoke调用,我想知道是否有人可以指导我如何从hbitmap检索原始像素数据(unsigned char *)。 这是我的情景: 我在C#端加载一个.NET Bitmap对象,并将它的IntPtr发送到我的非托管c ++方法。 一旦我在C ++端收到hbitmap ptr,我想访问Bitmaps的像素数据。 我已经创建了一个接受unsigned char *的方法,它表示来自c#的原始像素数据但是我发现从c#中提取byte []相当慢。 这就是为什么我想发送Bitmap ptr而不是将Bitmap转换为byte []并将其发送到我的C ++方法。 用于获取Bitmap IntPtr的C#代码 Bitmap srcBitmap = new Bitmap(m_testImage); IntPtr hbitmap = srcBitmap.GetHbitmap(); 用于导入c ++方法的C#代码 [SuppressUnmanagedCodeSecurityAttribute()] [DllImport(“MyDll.dll”, CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)] public static extern int ResizeImage(IntPtr srcImg); 将接收Hbitmap处理程序的C ++方法 int Resize::ResizeImage(unsigned char* srcImg){ //access srcImgs […]

你能在Bitmap图像中将一种颜色更改为另一种颜色吗?

对于Bitmap ,有一个MakeTransparent方法,有一个类似的用于将一种颜色更改为另一种颜色吗? // This sets Color.White to transparent Bitmap myBitmap = new Bitmap(sr.Stream); myBitmap.MakeTransparent(System.Drawing.Color.White); 有什么东西可以做这样的事吗? Bitmap myBitmap = new Bitmap(sr.Stream); myBitmap.ChangeColor(System.Drawing.Color.Black, System.Drawing.Color.Gray);

C# – Base64字节数组到Image FAILS无论我尝试什么

我在从base64编码的字节数组中用C#创建一个Image / Bitmap对象时遇到了麻烦。 这是我正在处理的事情: 我有一个前端,用户可以裁剪图像。 当用户通过input[type=file]选择图像时,我的javascript代码使用HTML5的FileReader将DataUrl (base64字符串)保存到hidden field ,该hidden field与裁剪坐标和尺寸以及其中的所有其他内容一起发布。 form 。 精华: base64数据,如果你想测试自己: http://kristianbak.com/test_image.txt base64字符串发布到操作,并作为参数imageData接收 该操作将字符串转换为base64字节数组,如下所示: byte[] imageBytes = Convert.FromBase64String(imageData.EncodeTo64()); EncodeTo64扩展方法: public static string EncodeTo64(this String toEncode) { var toEncodeAsBytes = Encoding.ASCII.GetBytes(toEncode); var returnValue = Convert.ToBase64String(toEncodeAsBytes); return returnValue; } 将base64字符串转换为字节数组后,我使用MemoryStream将字节读入内存: using (var imageStream = new MemoryStream(imageBytes, false)) { Image image = Image.FromStream(imageStream); //ArgumentException: Parameter […]

将位图从c#传递到c ++

我有一个基于opencv用C ++编写的图像处理函数。 在我的wpf应用程序中,我使用AForge库来访问网络摄像头并在UI上更新它。 这是处理新帧的function。 void UI_NewFrame(object sender, NewFrameEventArgs eventArgs) { try { System.Drawing.Bitmap bitmapFrame = (Bitmap)eventArgs.Frame.Clone(); MemoryStream ms = new MemoryStream(); bitmapFrame.Save(ms, ImageFormat.Bmp); ms.Seek(0, SeekOrigin.Begin); BitmapImage bitmapImageFrame = new BitmapImage(); bitmapImageFrame.BeginInit(); bitmapImageFrame.StreamSource = ms; bitmapImageFrame.EndInit(); bitmapImageFrame.Freeze(); CurrentFrame = bitmapImageFrame; } catch (Exception ex) { Debug.WriteLine(“fatal::” + ex.Message); } } 这是我的c ++代码: void FaceTracker(unsigned char* imageBuffer, […]

如何以编程方式将文本添加到位图图像? WPF

我正在使用Kinect传感器通过将video输入设置为位图源来显示图像上的video,如下所示。 但我的问题是如何将图像添加到图像/位图,例如分数计数器,我在下面添加了一张图片来展示我想要实现的目标。 void myKinect_ColorFrameReady(object sender, ColorImageFrameReadyEventArgs e) { using (ColorImageFrame colorFrame = e.OpenColorImageFrame()) { if (colorFrame == null) return; byte[] colorData = new byte[colorFrame.PixelDataLength]; colorFrame.CopyPixelDataTo(colorData); KinectVideo.Source = BitmapSource.Create(colorFrame.Width, colorFrame.Height, 96, 96, PixelFormats.Bgr32, null, colorData, colorFrame.Width * colorFrame.BytesPerPixel); } }

GetEncoderParameterList意外的“位图区域已锁定”exception。 有任何想法吗?

我正在尝试使用Microsoft的此示例代码来确定JPEG编码器可用的编码器选项。 (我想解决的真正问题是看看我是否可以明确设置色度子采样参数) http://msdn.microsoft.com/en-us/library/bb882589.aspx private void GetSupportedParameters(PaintEventArgs e) { Bitmap bitmap1 = new Bitmap(1, 1); ImageCodecInfo jpgEncoder = GetEncoder(ImageFormat.Jpeg); EncoderParameters paramList = bitmap1.GetEncoderParameterList(jpgEncoder.Clsid); EncoderParameter[] encParams = paramList.Param; StringBuilder paramInfo = new StringBuilder(); for (int i = 0; i < encParams.Length; i++) { paramInfo.Append("Param " + i + " holds " + encParams[i].NumberOfValues + " items of […]