/// <summary> /// 放大图片 /// </summary> /// <param name="img"></param> /// <param name="times"></param> /// <returns></returns> public static Bitmap ZoomInTimesByMomery(Bitmap img, int times) { //初始化大小图片 Bitmap bmp = FormatHelper.FromHighbitTo24bit(img); Bitmap largeBmp = new Bitmap((int)(img.Width * times), (int)(img.Height * times), PixelFormat.Format24bppRgb); Rectangle bmpRect = new Rectangle(0, 0, bmp.Width, bmp.Height); Rectangle largeBmpRect = new Rectangle(0, 0, largeBmp.Width, largeBmp.Height); BitmapData bmpData = bmp.LockBits(bmpRect, ImageLockMode.ReadOnly, bmp.PixelFormat); BitmapData largeBmpData = largeBmp.LockBits(largeBmpRect, ImageLockMode.WriteOnly, largeBmp.PixelFormat); int bytes = bmpData.Stride * bmp.Height; int largBytes = largeBmpData.Stride * largeBmp.Height; byte[] rgbValues = new byte[bytes]; byte[] largeRgbValues = new byte[largBytes]; IntPtr ptr = bmpData.Scan0; IntPtr largePtr = largeBmpData.Scan0; Marshal.Copy(ptr, rgbValues, 0, bytes); Marshal.Copy(largePtr, largeRgbValues, 0, largBytes); //循环遍历所有原始图片像素 for (int Y = 0; Y < bmpData.Height; Y++) { for (int X = 0; X < bmpData.Width * 3; X += 3) { //获取像素rgb值 byte b = rgbValues[Y * bmpData.Stride + X]; byte g = rgbValues[Y * bmpData.Stride + X + 1]; byte r = rgbValues[Y * bmpData.Stride + X + 2]; //循环设置对应的所有放大图片像素点 for (int yTime = 0; yTime < times; yTime++) { for (int xTime = 0; xTime < times; xTime++) { largeRgbValues[(Y * times + yTime) * largeBmpData.Stride + X * times + 3 * xTime] = b; largeRgbValues[(Y * times + yTime) * largeBmpData.Stride + X * times + 3 * xTime + 1] = g; largeRgbValues[(Y * times + yTime) * largeBmpData.Stride + X * times + 3 * xTime + 2] = r; } } } } Marshal.Copy(rgbValues, 0, ptr, bytes); Marshal.Copy(largeRgbValues, 0, largePtr, largBytes); bmp.UnlockBits(bmpData); largeBmp.UnlockBits(largeBmpData); return largeBmp; }