【发布时间】:2019-06-18 17:22:40
【问题描述】:
我正在开发一个处理图像的软件,现在我想改变白平衡并在我的照片上添加一些饱和度,所以我必须处理每个像素值。 我试图将我的 BitmapImage 转换为 WritableBitmap,然后我尝试了这段代码。但是如果我运行它,我的图像会变成绿色。 我想从该图像中获取像素,然后将它们设置为新值。 我搜索了很多解决方案,但没有找到,所以也许有人可以帮助我编写代码。谢谢。
public static WriteableBitmap Colors(Bitmap Image)
{
int width = Image.Width;
int height = Image.Width;
byte[,,] pixels = new byte[height, width, 4];
WriteableBitmap wbitmap = new WriteableBitmap(width, height, 96, 96, PixelFormats.Bgra32, null);
var target = new Bitmap(Image.Width, Image.Height);
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
pixels[i, j, 1] -= 30;
pixels[i, j, 3] -= 30;
}
}
byte[] pixels1d = new byte[height * width * 4];
int index = 0;
for (int row = 0; row < height; row++)
{
for (int col = 0; col < width; col++)
{
for (int i = 0; i < 4; i++)
pixels1d[index++] = pixels[row, col, i];
}
}
Int32Rect rect = new Int32Rect(0, 0, width, height);
int stride = 4 * width;
wbitmap.WritePixels(rect, pixels1d, stride, 0);
return wbitmap;
}
然后我像这样运行它:
private void run_OnClick(object sender, RoutedEventArgs e)
{
// Contrastt(BitmapImage2Bitmap(bitmap), 10);
// MedianFilter(BitmapImage2Bitmap(bitmap),5);
WriteableBitmap writeableBitmap = new WriteableBitmap(imageX);
BitmapImage colored = ConvertWriteableBitmapToBitmapImage(Colors((BitmapImage2Bitmap(bitmap))));
ImageBrush brush = new ImageBrush();
brush.ImageSource = imageX ;
CanvasProcessedImage.Background = brush;
}
【问题讨论】:
-
您使用 WinForms Bitmap 类有什么特别的原因吗? WPF BitmapSource(BitmapImage 和 WriteableBitmap 的基类)具有 CopyPixels 方法来检索其原始像素缓冲区。您可以操作该缓冲区并从中创建一个新的 BitmapSource。或者您直接操作 WriteableBitmap 的像素。除此之外,几乎没有必要将 WriteableBitmap 转换为 BitmapImage,因为您通常可以使用一个代替另一个,例如作为 Image 元素的 Source 属性的值。
-
不,没有。我只是初学者,并试图在本周末之前完成这个应用程序,并且我正在尝试我找到的所有内容。我正在尝试获取我的像素并修改它们。目前我想让我的所有像素都变成-30红色和-30绿色。这就是我暂时想要的。我可以处理我的位图,而不是副本。
标签: c# wpf image-processing