
curBitmap为载入的jpg图片。
private void MemeryMethod()
{
if (null == curBitmap)
return;
int width = curBitmap.Width;
int height = curBitmap.Height;
Rectangle rect = new Rectangle(0, 0, width, height);
System.Drawing.Imaging.BitmapData bmpData = curBitmap.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, curBitmap.PixelFormat);
IntPtr ptr = bmpData.Scan0;
int bytes = width * height * 3;
byte[] rgbValues = new byte[bytes];
System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0,bytes);
double colorTemp;
for (int i = 0; i < rgbValues.Length; i += 3)
{
colorTemp = rgbValues[i + 2] * 0.299 + rgbValues[i + 1] * 0.587 + rgbValues[i] * 0.114;
rgbValues[i] = rgbValues[i + 1] = rgbValues[i + 2] = (byte)colorTemp;
}
System.Runtime.InteropServices.Marshal.Copy(rgbValues, 0, ptr, bytes );
curBitmap.UnlockBits(bmpData);
Invalidate();
}
------解决思路----------------------
百度一下图像二值化 例子很多
------解决思路----------------------
所以1个像素应该是4bytes,你只用了3bytes,所以只有3/4的图像被替换了
------解决思路----------------------
我在其他帖子的回复
Bitmap bmp = new Bitmap(100, 100);
using (Graphics g = Graphics.FromImage(bmp))
{
g.FillEllipse(Brushes.Red, new Rectangle(0, 0, 80, 80));
g.FillRectangle(new SolidBrush(Color.FromArgb(128, Color.Green)), new Rectangle(20, 20, 80, 80));
}
e.Graphics.DrawImage(bmp, new Point(10, 10));
//简单的
ControlPaint.DrawImageDisabled(e.Graphics, bmp, 120, 10, Color.White);
//用颜色矩阵
System.Drawing.Imaging.ImageAttributes attr = new System.Drawing.Imaging.ImageAttributes();
float[][] colorMatrixElements = {
new float[] {.33f, .33f, .33f, 0, 0}, // r = (r+g+b)/3
new float[] {.33f, .33f, .33f, 0, 0}, // g = (r+g+b)/3
new float[] {.33f, .33f, .33f, 0, 0}, // b = (r+g+b)/3
new float[] {0, 0, 0, 1, 0}, // alpha scaling factor of 1
new float[] {0, 0, 0, 0, 1}}; //
System.Drawing.Imaging.ColorMatrix matrix = new System.Drawing.Imaging.ColorMatrix(colorMatrixElements);
attr.SetColorMatrix(matrix);
e.Graphics.DrawImage(bmp, new Rectangle(10, 120, 100, 100), 0, 0, 100, 100, GraphicsUnit.Pixel, attr);