图片灰度处理

一、WPF灰度处理(转)

文章的内容是来自微软中文技术论坛的一个帖子,当时是想将一段将图片灰度处理的代码转换为XAML的一个样式,在这里要谢谢


Xiao Yan Qiang
Sheldon _Xiao、shixin的热情回答,现在将他们的回答贴出来供大家学习参考.内容如下:

提问: 这个功能如何写成一个样式,将一个窗体内所有的Image控件的图片格式都转换为Gray8

BitmapImage bitmapImage = new BitmapImage(new Uri("D:\\Face.jpg"));
FormatConvertedBitmap newFormatedBitmapSource = new FormatConvertedBitmap();
newFormatedBitmapSource.BeginInit();
newFormatedBitmapSource.Source = bitmapImage;
newFormatedBitmapSource.DestinationFormat = PixelFormats.Gray8;
newFormatedBitmapSource.EndInit();
img.Source = newFormatedBitmapSource;
this.Content = img;

Xiao Yan Qiang的回答:

public class ImageAttached
{
    // Gray8附加属性,Gary8图片样式的"开关"
public static readonly DependencyProperty Gray8Property =
        DependencyProperty.RegisterAttached("Gray8", typeof(bool), typeof(ImageAttached),
            new FrameworkPropertyMetadata((bool)false,
                new PropertyChangedCallback(OnGray8Changed)));

    public static bool GetGray8(DependencyObject d)
    {
        return (bool)d.GetValue(Gray8Property);
    }

    public static void SetGray8(DependencyObject d, bool value)
    {
        d.SetValue(Gray8Property, value);
    }

    private static void OnGray8Changed(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        Image currentImage = d as Image;
        if (currentImage == null)
        {
            return;
        }

        bool isGray8 = (bool)d.GetValue(Gray8Property);

        if (isGray8)
        {
            // 附加BitmapSourceBackup属性,备份当前BitmapSource,以备恢复用
BitmapSource backupBitmapSource = (currentImage.Source as BitmapSource).CloneCurrentValue();
            d.SetValue(BitmapSourceBackupProperty, backupBitmapSource);

            // 建立Gray8的BitmapSource
FormatConvertedBitmap newFormatedBitmapSource = new FormatConvertedBitmap();
            newFormatedBitmapSource.BeginInit();
            newFormatedBitmapSource.Source = currentImage.Source as BitmapSource;
            newFormatedBitmapSource.DestinationFormat = PixelFormats.Gray8;
            newFormatedBitmapSource.EndInit();

            // 替换ImageSource
currentImage.Source = newFormatedBitmapSource;
        }
        else
        {
            // 图像恢复操作
object obj = currentImage.GetValue(BitmapSourceBackupProperty);
            if (obj == null)
            {
                return;
            }

            BitmapSource bs = obj as BitmapSource;
            if (bs == null)
            {
                return;
            }

            currentImage.Source = bs;
        }
    }

    // 备份用源图像的附加属性,当Gray8变更时,自动附加
public static readonly DependencyProperty BitmapSourceBackupProperty =
        DependencyProperty.RegisterAttached("BitmapSourceBackup", typeof(BitmapSource), typeof(ImageAttached),
            new FrameworkPropertyMetadata(null));

    public static BitmapSource GetBitmapSourceBackup(DependencyObject d)
    {
        return (BitmapSource)d.GetValue(BitmapSourceBackupProperty);
    }

    public static void SetBitmapSourceBackup(DependencyObject d, BitmapSource value)
    {
        d.SetValue(BitmapSourceBackupProperty, value);
    }
}
然后XAML里添加 local:ImageAttached.Gray8="True" 
 
        <Image xmlns:local="clr-namespace:WpfImageGray8Sample" Source="/WpfImageGray8Sample;component/Images/44537119.jpg" local:ImageAttached.Gray8="True" />
 
这样就可以方便控制Gray8了。
 

 
Sheldon _Xiao

的回答:

 
推荐了一个链接: http://www.rikware.com/post/Setting-FormatConvertedBitmap-Source-via-Binding.aspx
 
里面也是用转换器实现
 
 

shixin的回答:

<Window x:Class="MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:y="clr-namespace:WpfApplication1"  Title="MainWindow" Height="350" Width="525">
            <Window.Resources>
                <y:GrayImage x:Key="GrayImage" />
            </Window.Resources>
            <Grid>
                <Image Source="{Binding RelativeSource={RelativeSource Self}, Path=Tag, Converter={StaticResource GrayImage}}" Tag="C:\Test.jpg" />
            </Grid>
        </Window>

xaml部分还可以写成这样

<Window.Resources>
            <y:GrayImage x:Key="GrayImage" />
            <Style TargetType="{x:Type Image}">
                <Setter Property="Source" Value="{Binding RelativeSource={RelativeSource Self}, Path=Tag, Converter={StaticResource GrayImage}}" />
            </Style>
        </Window.Resources>
        <Grid>
            <Image Tag="C:\Test.jpg" />
        </Grid>

Public Class GrayImage
    Implements IValueConverter
    Public Function Convert(ByVal value As Object, ByVal targetType As Type, ByVal parameter As Object, ByVal culture As Globalization.CultureInfo) As Object Implements IValueConverter.Convert
        Try
            Dim newFormatedBitmapSource As New FormatConvertedBitmap
            newFormatedBitmapSource.BeginInit()
            newFormatedBitmapSource.Source = New BitmapImage(New Uri(value.ToString))
            newFormatedBitmapSource.DestinationFormat = PixelFormats.Gray8
            newFormatedBitmapSource.EndInit()
            Convert = newFormatedBitmapSource
        Catch
            Convert = Nothing
        End Try
    End Function
    Public Function ConvertBack(ByVal value As Object, ByVal targetType As Type, ByVal parameter As Object, ByVal culture As Globalization.CultureInfo) As Object Implements IValueConverter.ConvertBack
        ConvertBack = value
    End Function
End Class
二、Windos8和WindowsPhone通过更改像素点颜色更改图片灰度
private async void Button_Click(object sender, RoutedEventArgs e)
       {
           // 实例化一个 300*300 的 WriteableBitmap,并将其作为 Image 控件的图片源
           WriteableBitmap writeableBitmap = new WriteableBitmap(300, 300);
           image2.Source = writeableBitmap;

           StorageFile file = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///Assets/2.jpg"));
           using (IRandomAccessStream fileStream = await file.OpenAsync(FileAccessMode.Read))
           {
               // 将指定的图片转换成 BitmapDecoder 对象
               BitmapDecoder decoder = await BitmapDecoder.CreateAsync(fileStream);

               // 通过 BitmapTransform 缩放图片的尺寸
               BitmapTransform transform = new BitmapTransform()
               {
                   ScaledWidth = Convert.ToUInt32(writeableBitmap.PixelWidth),
                   ScaledHeight = Convert.ToUInt32(writeableBitmap.PixelHeight)
               };

               // 获取图片的 PixelDataProvider 对象
               PixelDataProvider pixelData = await decoder.GetPixelDataAsync(
                   BitmapPixelFormat.Bgra8,
                   BitmapAlphaMode.Straight,
                   transform,
                   ExifOrientationMode.IgnoreExifOrientation,
                   ColorManagementMode.DoNotColorManage);

               // 获取图片的像素数据,由于之前指定的格式是 BitmapPixelFormat.Bgra8,所以每一个像素由 4 个字节组成,分别是 bgra
               byte[] sourcePixels = pixelData.DetachPixelData();
               for (int i = 0; i < sourcePixels.Length; i+=4)
               {                  
                     
                     byte B = sourcePixels[i];
                     byte G = sourcePixels[i + 1];
                     byte R = sourcePixels[i + 2];
                     byte A = sourcePixels[i + 3]; 
                     byte GrayValue = (byte)(R * 0.299 + G * 0.587 + B * 0.114);
                    sourcePixels[i]=GrayValue;
                    sourcePixels[i + 1]=GrayValue;
                    sourcePixels[i + 2]=GrayValue;
                    sourcePixels[i + 3]=0xFF; 
               }
               // 将修改后的像素数据写入 WriteableBitmap 对象的像素缓冲区(WriteableBitmap 使用的是 BGRA 格式)
               using (Stream stream = writeableBitmap.PixelBuffer.AsStream()) // IBuffer.AsStream() 为来自 System.Runtime.InteropServices.WindowsRuntime.WindowsRuntimeBufferExtensions 中的扩展方法
               {
                   await stream.WriteAsync(sourcePixels, 0, sourcePixels.Length);
               }
           }
           // 用像素缓冲区的数据绘制图片
           writeableBitmap.Invalidate();
       }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32是一种微控制器系列,具有强大的处理能力和丰富的外设资源,可以用于图像灰度处理。 首先,图像灰度处理是将彩色图像转变为灰度图像的过程。在STM32上实现图像灰度处理的基本步骤如下: 步骤1:获取图像数据。可以通过摄像头、图像传感器等设备获取图像数据,并将其存储到STM32的内存中。 步骤2:图像数据预处理。由于STM32的处理能力有限,通常需要对图像数据进行预处理,以降低计算量。预处理可以包括图像的降采样、滤波等操作。 步骤3:图像灰度处理算法。常见的图像灰度处理算法有平均法、最大值法、最小值法等。选择合适的算法,对每个像素点进行处理,将RGB值转换为灰度值。 步骤4:输出灰度图像。将处理后的图像数据输出到显示设备,如LCD屏幕或通过通信接口传输到计算机。 在STM32的软件开发中,可以使用C语言或汇编语言编写图像灰度处理的程序。可以使用STM32提供的外设库和相关开发工具,如STM32CubeMX和Keil等,来简化开发过程。通过对STM32的寄存器进行配置和操作,实现对图像数据的读取、处理和输出。 需要注意的是,图像灰度处理是一项计算密集型任务,可能会占用较多的处理器资源和内存空间。因此,在开发过程中需要注意优化算法和代码,以提高处理效率和节省系统资源。 综上所述,使用STM32进行图像灰度处理需要通过获取图像数据、预处理灰度处理算法和输出等步骤来完成。通过合理的算法选择和优化,可以在STM32上实现高效的图像灰度处理

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值