Witam wszystkich.
Jestem w trakcie tworzenia prostego programu do edycji zdjęć w silverlighcie i mam kilka problemów.
Może najpierw kod:
XAML
<code=xaml >
<UserControl x:Class="SilverlightApplication2.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
mc:Ignorable="d"
d:DesignHeight="1200" d:DesignWidth="800">
<Grid x:Name="LayoutRoot" Background="Black" AllowDrop="True" Drop="LayoutRoot_Drop">
<StackPanel x:Name="DropCollection" Height="100" Margin="10,30,10,10" VerticalAlignment="Top" HorizontalAlignment="Center" Orientation="Horizontal">
</StackPanel>
<Image x:Name="DropImage" Cursor="Hand" Width="400" >
<i:Interaction.Behaviors>
<ei:MouseDragElementBehavior ConstrainToParentBounds="True"/>
</i:Interaction.Behaviors>
</Image>
<Button x:Name="btnMakeGray" Content="Gray" Height="50" HorizontalAlignment="Left" Margin="0,264,0,0" VerticalAlignment="Top" Width="75" />
<Button x:Name="btnMakeSepia" Content="Sepia" Height="54" HorizontalAlignment="Left" Margin="0,342,0,0" VerticalAlignment="Top" Width="75" />
</Grid>
</UserControl>
.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.IO;
using System.Windows.Media.Imaging;
namespace SilverlightApplication2
{
public partial class MainPage : UserControl
{
public MainPage()
{
InitializeComponent();
ImageSource img = DropImage.Source;
btnMakeGray.Click += (sender, args) => { DropImage.Source = MakeGray(DropImage); };
}
WriteableBitmap MakeGray(Image img)
{
WriteableBitmap bitmap = new WriteableBitmap(img, null);
for (int y = 0; y < bitmap.PixelHeight; y++)
{
for (int x = 0; x < bitmap.PixelWidth; x++)
{
int pixelLocation = bitmap.PixelWidth * y + x;
int pixel = bitmap.Pixels[pixelLocation];
byte[] pixelBytes = BitConverter.GetBytes(pixel);
byte bwPixel = (byte)(.299 * pixelBytes[2] + .587 * pixelBytes[1] + .114 * pixelBytes[0]);
pixelBytes[0] = bwPixel;
pixelBytes[1] = bwPixel;
pixelBytes[2] = bwPixel;
bitmap.Pixels[pixelLocation] = BitConverter.ToInt32(pixelBytes, 0);
}
}
return bitmap;
}
private void LayoutRoot_Drop(object sender, DragEventArgs e)
{
if (e.Data != null)
{
//Czytamy zrzucony plik
FileInfo file = ((FileInfo[])e.Data.GetData(DataFormats.FileDrop)).FirstOrDefault();
//Bitmapa
BitmapImage img = new BitmapImage();
using (Stream s = file.OpenRead())
{
img.SetSource(s);
}
DropImage.Source = img;
Image newImage = new Image { Source = img };
newImage.MouseLeftButtonDown += (a, b) =>
{
DropImage.Source = newImage.Source;
};
DropCollection.Children.Add(newImage);
}
}
}
}
Jak widać ,obsługa zdarzenia drag&drop jest już zrobiona.
Zmiana efektu zdjęcia odbywa się za pomocą WriteableBitmap .
Potrzebuję pomocy w :
- Napisaniu efektu sepia
- Zamianie efektu zdjęcia (np. użyłem czarno biały ale chcę zmienić na sepię)
- Resetu do oryginalnego stanu zdjęcia (przed edycją)