110,552
社区成员
发帖
与我相关
我的任务
分享
using System;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
Bitmap image;
int imageHeight;
int imageWidth;
int[,] matrix;
PictureBox picture;
public Form1()
{
InitializeComponent();
DoubleBuffered = true;
Shown += Form1_Shown;
}
protected override void OnMouseMove(MouseEventArgs e)
{
base.OnMouseMove(e);
Invalidate();
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
if (image == null)
{
return;
}
var count = 10;
ParallelEnumerable.Range(0, imageWidth / count).SelectMany(
i => ParallelEnumerable.Range(0, imageHeight / count),
(i, j) => new {ri = i, rj = j}).ForAll(r =>
{
var lst =
Enumerable.Range(r.ri * count, count).SelectMany(i => Enumerable.Range(r.rj * count, count),
(i, j) => new {i, j}).ToList();
var avg = (int)lst.Select(rec => matrix[rec.i, rec.j]).Average();
lst.ForEach(rec => matrix[rec.i, rec.j] = avg);
});
var m = new Bitmap(image);
var l = PointToClient(MousePosition);
for (var i = 0; i < Math.Min(imageWidth, l.X); i++)
{
for (var j = 0; j < Math.Min(imageHeight, l.Y); j++)
{
m.SetPixel(i, j, Color.FromArgb(matrix[i, j]));
}
}
e.Graphics.DrawImage(m, 0, 0);
}
void Form1_Shown(object sender, EventArgs e)
{
if (!getImage())
{
Close();
}
Invalidate();
}
bool getImage()
{
var fd = new OpenFileDialog();
if (fd.ShowDialog() != DialogResult.OK)
{
return false;
}
try
{
image = new Bitmap(fd.FileName);
}
catch
{
return false;
}
matrix = new int[image.Width, image.Height];
imageHeight = image.Height;
imageWidth = image.Width;
for (var i = 0; i < image.Width; i++)
{
for (var j = 0; j < image.Height; j++)
{
matrix[i, j] = image.GetPixel(i, j).ToArgb();
}
}
return true;
}
}
}
public void mosaic(int size)
{
var x_count = _bit_data.Width / size * size;
var y_count = _bit_data.Height / size * size;
for (int top = 0; top < y_count; top += size)
{
for (int left = 0; left < x_count; left += size)
{
var color = get_mosaic_color(left, top, size, size);
set_block_pixel(new Rectangle(left, top, size, size), color);
}
}
}
int get_mosaic_color(int left, int top, int width, int height)
{
var avg_a = 0;
var avg_r = 0;
var avg_g = 0;
var avg_b = 0;
for (int i = top; i < top + height; i++)
{
for (int j = left; j < left + width; j++)
{
var argb = *((ARGBPixel*)get_offset(j, i));
avg_a += argb.Alpha;
avg_r += argb.Red;
avg_g += argb.Green;
avg_b += argb.Blue;
}
}
var count = width * height;
avg_a = avg_a / count;
avg_r = avg_r / count;
avg_g = avg_g / count;
avg_b = avg_b / count;
return ARGBPixel.from_argb((byte)avg_a, (byte)avg_r, (byte)avg_g, (byte)avg_b);
}