/// <summary> /// Zdarzenie ładowania obrazu z pliku do zmiennej przechowującej bitmapę. /// </summary> private void LoadButton_OnClick(object sender, RoutedEventArgs e) { bmp = null; img.Source = null; if (File.Exists(model.SciezkaPliku)) { bmp = new Bitmap(model.SciezkaPliku); // konwersja formatu pikseli na 32argb w przypadku innego formatu tychże if (!bmp.PixelFormat.Equals(PixelFormat.Format32bppArgb)) { bmp = Konwerter.ZmianaFormatuPikseli(bmp); } img.Source = Konwerter.KonwertujBitmapeNaObraz(bmp); model.KonwertAktywny = true; } else { MessageBox.Show("Nie wskazano pliku.", "Error", MessageBoxButton.OK, MessageBoxImage.Error); } }
/// <summary> /// Zdarzenie konwersji grafiki. /// </summary> private void ConvertButton_OnClick(object sender, RoutedEventArgs e) { if (bmp == null) { MessageBox.Show("Proszę najpierw załadować plik graficzny.", "ERROR", MessageBoxButton.OK, MessageBoxImage.Error); return; } model.CzyAktywny = false; model.KonwertAktywny = false; Stopwatch stopWatch = new Stopwatch(); List <Thread> threads = new List <Thread>(); byte[] rgbValues = Konwerter.KonwertujBitmapeDoTablicy(bitmap: bmp); int pixels = (rgbValues.Length / 4); // ilość pikseli if (model.Watki > pixels) { model.Watki = (short)(pixels); MessageBox.Show("Przekroczono bezpieczną liczbę wątków dla zbyt małego obrazka. Ustawiono optymalną liczbę wątków: " + model.Watki, "Info", MessageBoxButton.OK, MessageBoxImage.Asterisk); } int rest = pixels % model.Watki; // ostatnie piksele obrazka do przejęcia przez ostatni wątek int length = (pixels - rest) / model.Watki * 4; // ilość elementów tablicy do przerobienia przez pojedynczy wątek int counter = 0; for (int j = 0; j < model.Watki - 1; j++) { int begin = counter; int end = counter + length; if (model.CsharpOK) { threads.Add(new Thread(() => Konwerter_C.ConvertToSepia(rgbValues, begin, end, model.Sepia))); } else { threads.Add(new Thread(() => Konwerter_ASM.ConvertToSepia(rgbValues, begin, end, model.Sepia))); } counter += length; } if (model.CsharpOK) { threads.Add(new Thread(() => Konwerter_C.ConvertToSepia(rgbValues, counter, rgbValues.Length, model.Sepia))); } else { threads.Add(new Thread(() => Konwerter_ASM.ConvertToSepia(rgbValues, counter, rgbValues.Length, model.Sepia))); } // mierzenie czasu wykonania pracy wątku/ów stopWatch.Start(); threads.ForEach(thread => thread.Start()); threads.ForEach(thread => thread.Join()); stopWatch.Stop(); StatusBarTextBlock.Text = String.Format("Przekonwertowano w {0} ms", stopWatch.Elapsed.Milliseconds); stopWatch.Reset(); bmp = Konwerter.KonwertujTabliceNaBitmape(bitmap: bmp, rgbValues: rgbValues); //wyświetlenie przekonwertowanego obrazu w interfejsie img.Source = Konwerter.KonwertujBitmapeNaObraz(bmp); model.CzyAktywny = true; }