public void Start(EChannel nチャンネル, CDTX.CBMP bmp, CDTX.CBMPTEX bmptex, int n開始サイズW, int n開始サイズH, int n終了サイズW, int n終了サイズH, int n画像側開始位置X, int n画像側開始位置Y, int n画像側終了位置X, int n画像側終了位置Y, int n表示側開始位置X, int n表示側開始位置Y, int n表示側終了位置X, int n表示側終了位置Y, int n総移動時間ms, int n移動開始時刻ms) { for (int i = 0; i < 8; i++) { if (nチャンネル == this.nChannel[i]) { this.stLayer[i].rBMP = bmp; this.stLayer[i].rBMPTEX = bmptex; this.stLayer[i].sz開始サイズ.Width = n開始サイズW; this.stLayer[i].sz開始サイズ.Height = n開始サイズH; this.stLayer[i].sz終了サイズ.Width = n終了サイズW; this.stLayer[i].sz終了サイズ.Height = n終了サイズH; this.stLayer[i].pt画像側開始位置.X = n画像側開始位置X; this.stLayer[i].pt画像側開始位置.Y = n画像側開始位置Y; this.stLayer[i].pt画像側終了位置.X = n画像側終了位置X; this.stLayer[i].pt画像側終了位置.Y = n画像側終了位置Y; this.stLayer[i].pt表示側開始位置.X = n表示側開始位置X; this.stLayer[i].pt表示側開始位置.Y = n表示側開始位置Y; this.stLayer[i].pt表示側終了位置.X = n表示側終了位置X; this.stLayer[i].pt表示側終了位置.Y = n表示側終了位置Y; this.stLayer[i].n総移動時間ms = n総移動時間ms; this.stLayer[i].n移動開始時刻ms = (n移動開始時刻ms != -1) ? n移動開始時刻ms : CDTXMania.Timer.nCurrentTime; } } }
public void SetChannel(Vector2i index, float value, EChannel chanel, float blend) { dirty = true; Color col = m_Colors[index.Y * m_Height + index.X]; col[(int)chanel] = Mathf.Lerp(col[(int)chanel], value, blend); m_Colors[index.Y * m_Height + index.X] = col; }
public void AddChannel(Vector2i index, float value, EChannel chanel) { dirty = true; Color col = m_Colors[index.Y * m_Height + index.X]; col[(int)chanel] = Mathf.Clamp01(col[(int)chanel] + value); m_Colors[index.Y * m_Height + index.X] = col; }
public void SetChannel(Vector2i index, float value, EChannel chanel) { dirty = true; Color col = m_Colors[index.Y * m_Height + index.X]; col[(int)chanel] = value; m_Colors[index.Y * m_Height + index.X] = col; }
public SplitChannelSettings(Image previewControl, Image tooltipControl, CheckBox invertCheckbox, Button saveButton, ImagePicker imagePicker, EChannel targetChannel) { this.previewControl = previewControl; this.tooltipControl = tooltipControl; this.invertCheckbox = invertCheckbox; this.saveButton = saveButton; this.targetChannel = targetChannel; this.imagePicker = imagePicker; }
// メソッド public void ChangeScope(EChannel nチャンネル, CDTX.CBMP bmp, CDTX.CBMPTEX bmptex) { for (int i = 0; i < 8; i++) { if (nチャンネル == this.nChannel[i]) { this.stLayer[i].rBMP = bmp; this.stLayer[i].rBMPTEX = bmptex; return; } } }
public void SetCoupling(EChannel channel, ECoupling coupling) { lock (lockObject) { if (channel == EChannel.CHA) { switch (coupling) { case ECoupling.DC: //DC耦合 g_CtrlByte0 &= 0xef; g_CtrlByte0 |= 0x10; MyDLLimport.USBCtrlTrans(0x94, g_CtrlByte0, 1); break; case ECoupling.AC: //AC耦合 g_CtrlByte0 &= 0xef; MyDLLimport.USBCtrlTrans(0x94, g_CtrlByte0, 1); break; default: break; } } else { switch (coupling) { case ECoupling.DC: //DC耦合 g_CtrlByte1 &= 0xef; g_CtrlByte1 |= 0x10; MyDLLimport.USBCtrlTrans(0x24, g_CtrlByte1, 1); break; case ECoupling.AC: //AC耦合 g_CtrlByte1 &= 0xef; g_CtrlByte1 |= 0x00; MyDLLimport.USBCtrlTrans(0x24, g_CtrlByte1, 1); break; default: break; } } } }
internal void play(EChannel eChannel, ESound eSound, float pitch = 0, float volume = 0.5f, bool muteOther = true) { if ((eChannel == EChannel.BGM && !SettingsManager.Instance.Music) || (eChannel == EChannel.SFX && !SettingsManager.Instance.Sfx) || (muteOther == false && !channels[eChannel].IsDisposed && channels[eChannel].State == SoundState.Playing))// && channels[eChannel].Equals(tmp))) return; if (!channels[eChannel].IsDisposed) { channels[eChannel].Stop(); channels[eChannel].Dispose(); } channels[eChannel] = sounds[eSound].CreateInstance(); channels[eChannel].Pitch = pitch; channels[eChannel].Volume = volume; channels[eChannel].IsLooped = (eChannel == EChannel.BGM); //channels[eChannel].IsLooped = loop; channels[eChannel].Play(); }
public void Start(int nLane, bool bボーナス, EChannel n代入番号) { for (int j = 0; j < 4; j++) { if (this.stボーナス[j].b使用中) { this.stボーナス[j].ct進行.tStop(); this.stボーナス[j].b使用中 = false; } } for (int i = 0; i < 1; i++) { for (int j = 0; j < 4; j++) { if (!this.stボーナス[j].b使用中) { this.stボーナス[j].b使用中 = true; this.stボーナス[j].ct進行 = new CCounter(0, 1020, 1, CDTXMania.Timer); } } } }
public void t初期化() { this.nChannelNumber = 0; this.nIntegerValue = 0; this.nIntegerValue_InternalNumber = 0; this.db実数値 = 0.0; this.nPlaybackPosition = 0; this.nPlaybackTimeMs = 0; this.bBonusChip = false; this.nLag = -999; this.n楽器パートでの出現順 = -1; this.bTargetGhost判定済み = false; this.bIsAutoPlayed = false; this.bChipKeepsPlayingAfterPerfEnds = false; this.dbChipSizeRatio = 1.0; this.bHit = false; this.bVisible = true; this.eInstrumentPart = EInstrumentPart.UNKNOWN; this.nTransparency = 0xff; this.nDistanceFromBar.Drums = 0; this.nDistanceFromBar.Guitar = 0; this.nDistanceFromBar.Bass = 0; this.n総移動時間 = 0; }
internal void stop(EChannel eChannel) { if (!channels[eChannel].IsDisposed) { channels[eChannel].Stop(); channels[eChannel].Dispose(); } }
internal void pause(EChannel eChannel) { channels[eChannel].Pause(); }
public static Bitmap ExtractChannel(string imagePath, EChannel channelToExtract, EChannel finalChannel, bool invert, string popupTextExtra = "") { if (!ImageUtility.Validation.IsValidImage(imagePath)) { return(new Bitmap(1, 1)); } var bitmap = new Bitmap(imagePath); var extractedBitmap = new Bitmap(bitmap.Width, bitmap.Height, PixelFormat.Format32bppArgb); PopupTextWindow.OpenWindowAndExecute($"Generating Texture By Extracting Channel, Please Wait {popupTextExtra}", () => { for (int y = 0; y < bitmap.Height; y++) { for (int x = 0; x < bitmap.Width; x++) { Color pixelColor = bitmap.GetPixel(x, y); int intensity; switch (channelToExtract) { case EChannel.R: intensity = pixelColor.R; break; case EChannel.G: intensity = pixelColor.G; break; case EChannel.B: intensity = pixelColor.B; break; case EChannel.A: intensity = ImageUtility.Validation.ImageHasTransparency(imagePath) ? pixelColor.A : 255; break; default: throw new ArgumentOutOfRangeException(nameof(channelToExtract), channelToExtract, null); } if (intensity > 0 & intensity <= 255) { if (invert) { intensity = 255 - intensity; } switch (finalChannel) { case EChannel.R: extractedBitmap.SetPixel(x, y, Color.FromArgb(255, intensity, 0, 0)); break; case EChannel.G: extractedBitmap.SetPixel(x, y, Color.FromArgb(255, 0, intensity, 0)); break; case EChannel.B: extractedBitmap.SetPixel(x, y, Color.FromArgb(255, 0, 0, intensity)); break; case EChannel.A: extractedBitmap.SetPixel(x, y, Color.FromArgb(255, intensity, intensity, intensity)); break; default: throw new ArgumentOutOfRangeException(nameof(finalChannel), finalChannel, null); } } else { extractedBitmap.SetPixel(x, y, Color.FromArgb(0, 0, 0, 0)); } } } }); bitmap.Dispose(); return(extractedBitmap); }
// メソッド public void Start(EChannel nチャンネル番号, CDTX.CAVI rAVI, int n開始サイズW, int n開始サイズH, int n終了サイズW, int n終了サイズH, int n画像側開始位置X, int n画像側開始位置Y, int n画像側終了位置X, int n画像側終了位置Y, int n表示側開始位置X, int n表示側開始位置Y, int n表示側終了位置X, int n表示側終了位置Y, int n総移動時間ms, int n移動開始時刻ms, bool bPlayFromBeginning = false) { //2016.01.21 kairera0467 VfW時代のコードを除去+大改造 Trace.TraceInformation("CActPerfAVI: Start(): " + rAVI.strファイル名); this.rAVI = rAVI; #region [ アスペクト比からどっちを使うか判別 ] // 旧DShowモードを使っていて、旧規格クリップだったら新DShowモードを使う。 //if( CDTXMania.ConfigIni.bDirectShowMode == false ) { this.fClipアスペクト比 = ((float)rAVI.avi.nフレーム幅 / (float)rAVI.avi.nフレーム高さ); //this.bUseMRenderer = false; } #endregion if (nチャンネル番号 == EChannel.Movie || nチャンネル番号 == EChannel.MovieFull) { if (this.bUseCAviDS) { //CAviDS this.rAVI = rAVI; this.n開始サイズW = n開始サイズW; this.n開始サイズH = n開始サイズH; this.n終了サイズW = n終了サイズW; this.n終了サイズH = n終了サイズH; this.n画像側開始位置X = n画像側開始位置X; this.n画像側開始位置Y = n画像側開始位置Y; this.n画像側終了位置X = n画像側終了位置X; this.n画像側終了位置Y = n画像側終了位置Y; this.n表示側開始位置X = n表示側開始位置X; this.n表示側開始位置Y = n表示側開始位置Y; this.n表示側終了位置X = n表示側終了位置X; this.n表示側終了位置Y = n表示側終了位置Y; this.n総移動時間ms = n総移動時間ms; this.n移動開始時刻ms = (n移動開始時刻ms != -1) ? n移動開始時刻ms : CSoundManager.rcPerformanceTimer.nCurrentTime; if ((this.rAVI != null) && (this.rAVI.avi != null)) { float f拡大率x; float f拡大率y; this.framewidth = (uint)this.rAVI.avi.nフレーム幅; this.frameheight = (uint)this.rAVI.avi.nフレーム高さ; if (this.tx描画用 == null) { this.tx描画用 = new CTexture(CDTXMania.app.Device, (int)this.framewidth, (int)this.frameheight, CDTXMania.app.GraphicsDeviceManager.CurrentSettings.BackBufferFormat, Pool.Managed); } if (fClipアスペクト比 < 1.77f) { //旧規格クリップだった場合 this.ratio1 = 720f / ((float)this.frameheight); this.position = (int)((1280f - (this.framewidth * this.ratio1)) / 2f); int num = (int)(this.framewidth * this.ratio1); if (num <= 565) { this.position = 295 + ((int)((565f - (this.framewidth * this.ratio1)) / 2f)); this.i1 = 0; this.i2 = (int)this.framewidth; this.rec = new Rectangle(0, 0, 0, 0); this.rec3 = new Rectangle(0, 0, 0, 0); this.rec2 = new Rectangle(0, 0, (int)this.framewidth, (int)this.frameheight); } else { this.position = 295 - ((int)(((this.framewidth * this.ratio1) - 565f) / 2f)); this.i1 = (int)(((float)(295 - this.position)) / this.ratio1); this.i2 = (int)((565f / ((float)num)) * this.framewidth); this.rec = new Rectangle(0, 0, this.i1, (int)this.frameheight); this.rec3 = new Rectangle(this.i1 + this.i2, 0, (((int)this.framewidth) - this.i1) - this.i2, (int)this.frameheight); this.rec2 = new Rectangle(this.i1, 0, this.i2, (int)this.frameheight); } this.tx描画用.vcScaleRatio.X = this.ratio1; this.tx描画用.vcScaleRatio.Y = this.ratio1; } else { //ワイドクリップの処理 this.ratio1 = 1280f / ((float)this.framewidth); this.position = (int)((720f - (this.frameheight * this.ratio1)) / 2f); this.i1 = (int)(this.framewidth * 0.23046875); this.i2 = (int)(this.framewidth * 0.44140625); this.rec = new Rectangle(0, 0, this.i1, (int)this.frameheight); this.rec2 = new Rectangle(this.i1, 0, this.i2, (int)this.frameheight); this.rec3 = new Rectangle(this.i1 + this.i2, 0, (((int)this.framewidth) - this.i1) - this.i2, (int)this.frameheight); this.tx描画用.vcScaleRatio.X = this.ratio1; this.tx描画用.vcScaleRatio.Y = this.ratio1; } if (this.framewidth > 420) { f拡大率x = 420f / ((float)this.framewidth); } else { f拡大率x = 1f; } if (this.frameheight > 580) { f拡大率y = 580f / ((float)this.frameheight); } else { f拡大率y = 1f; } if (f拡大率x > f拡大率y) { f拡大率x = f拡大率y; } else { f拡大率y = f拡大率x; } this.smallvc = new Vector3(f拡大率x, f拡大率y, 1f); this.vclip = new Vector3(1.42f, 1.42f, 1f); this.rAVI.avi.Run(); } } else { this.rAVI = rAVI; this.n開始サイズW = n開始サイズW; this.n開始サイズH = n開始サイズH; this.n終了サイズW = n終了サイズW; this.n終了サイズH = n終了サイズH; this.n画像側開始位置X = n画像側開始位置X; this.n画像側開始位置Y = n画像側開始位置Y; this.n画像側終了位置X = n画像側終了位置X; this.n画像側終了位置Y = n画像側終了位置Y; this.n表示側開始位置X = n表示側開始位置X; this.n表示側開始位置Y = n表示側開始位置Y; this.n表示側終了位置X = n表示側終了位置X; this.n表示側終了位置Y = n表示側終了位置Y; this.n総移動時間ms = n総移動時間ms; this.n移動開始時刻ms = (n移動開始時刻ms != -1) ? n移動開始時刻ms : CSoundManager.rcPerformanceTimer.nCurrentTime; this.n前回表示したフレーム番号 = -1; if ((this.rAVI != null) && (this.rAVI.avi != null)) { float f拡大率x; float f拡大率y; this.framewidth = this.rAVI.avi.nフレーム幅; this.frameheight = this.rAVI.avi.nフレーム高さ; if (this.tx描画用 == null) { this.tx描画用 = new CTexture(CDTXMania.app.Device, (int)this.framewidth, (int)this.frameheight, CDTXMania.app.GraphicsDeviceManager.CurrentSettings.BackBufferFormat, Pool.Managed); } if (fClipアスペクト比 < 1.77f) { //旧規格クリップだった場合 this.ratio1 = 720.0f / this.frameheight; this.position = (int)((1280.0f - (this.framewidth * this.ratio1)) / 2.0f); int num = (int)(this.framewidth * this.ratio1); if (num <= 565) { this.position = 295 + ((int)((565f - (this.framewidth * this.ratio1)) / 2f)); this.i1 = 0; this.i2 = (int)this.framewidth; this.rec = new Rectangle(0, 0, 0, 0); this.rec3 = new Rectangle(0, 0, 0, 0); this.rec2 = new Rectangle(0, 0, (int)this.framewidth, (int)this.frameheight); } else { this.position = 295 - ((int)(((this.framewidth * this.ratio1) - 565f) / 2f)); this.i1 = (int)(((float)(295 - this.position)) / this.ratio1); this.i2 = (int)((565f / ((float)num)) * this.framewidth); this.rec = new Rectangle(0, 0, this.i1, (int)this.frameheight); this.rec3 = new Rectangle(this.i1 + this.i2, 0, (((int)this.framewidth) - this.i1) - this.i2, (int)this.frameheight); this.rec2 = new Rectangle(this.i1, 0, this.i2, (int)this.frameheight); } this.tx描画用.vcScaleRatio.X = this.ratio1; this.tx描画用.vcScaleRatio.Y = this.ratio1; } else { //ワイドクリップの処理 this.ratio1 = 1280f / ((float)this.framewidth); this.position = (int)((720f - (this.frameheight * this.ratio1)) / 2f); this.i1 = (int)(this.framewidth * 0.23046875); this.i2 = (int)(this.framewidth * 0.44140625); this.rec = new Rectangle(0, 0, this.i1, (int)this.frameheight); this.rec2 = new Rectangle(this.i1, 0, this.i2, (int)this.frameheight); this.rec3 = new Rectangle(this.i1 + this.i2, 0, (((int)this.framewidth) - this.i1) - this.i2, (int)this.frameheight); this.tx描画用.vcScaleRatio.X = this.ratio1; this.tx描画用.vcScaleRatio.Y = this.ratio1; } if (this.framewidth > 420) { f拡大率x = 420f / ((float)this.framewidth); } else { f拡大率x = 1f; } if (this.frameheight > 580) { f拡大率y = 580f / ((float)this.frameheight); } else { f拡大率y = 1f; } if (f拡大率x > f拡大率y) { f拡大率x = f拡大率y; } else { f拡大率y = f拡大率x; } this.smallvc = new Vector3(f拡大率x, f拡大率y, 1f); this.vclip = new Vector3(1.42f, 1.42f, 1f); } } } }
public void Start(EChannel nチャンネル, CDTX.CBMP bmp, CDTX.CBMPTEX bmptex, int n開始サイズW, int n開始サイズH, int n終了サイズW, int n終了サイズH, int n画像側開始位置X, int n画像側開始位置Y, int n画像側終了位置X, int n画像側終了位置Y, int n表示側開始位置X, int n表示側開始位置Y, int n表示側終了位置X, int n表示側終了位置Y, int n総移動時間ms) { this.Start(nチャンネル, bmp, bmptex, n開始サイズW, n開始サイズH, n終了サイズW, n終了サイズH, n画像側開始位置X, n画像側開始位置Y, n画像側終了位置X, n画像側終了位置Y, n表示側開始位置X, n表示側開始位置Y, n表示側終了位置X, n表示側終了位置Y, n総移動時間ms, -1); }
public Message(string name, EChannel channel) { this.Name = name; this.Channel = channel; }
public void SetVoltageDIV(EChannel channel, EVoltageDIV voltageDIV) { lock (lockObject) { if (channel == EChannel.CHA) { switch (voltageDIV) { case EVoltageDIV.DIV_250MV: g_CtrlByte1 &= 0xF7; MyDLLimport.USBCtrlTrans(0x22, 0x04, 1); MyDLLimport.USBCtrlTrans(0x24, g_CtrlByte1, 1); break; case EVoltageDIV.DIV_500MV: g_CtrlByte1 &= 0xF7; MyDLLimport.USBCtrlTrans(0x22, 0x02, 1); MyDLLimport.USBCtrlTrans(0x24, g_CtrlByte1, 1); break; case EVoltageDIV.DIV_1V: g_CtrlByte1 &= 0xF7; g_CtrlByte1 |= 0x08; MyDLLimport.USBCtrlTrans(0x22, 0x04, 1); MyDLLimport.USBCtrlTrans(0x24, g_CtrlByte1, 1); break; case EVoltageDIV.DIV_2V5: g_CtrlByte1 &= 0xF7; g_CtrlByte1 |= 0x08; MyDLLimport.USBCtrlTrans(0x22, 0x02, 1); MyDLLimport.USBCtrlTrans(0x24, g_CtrlByte1, 1); break; case EVoltageDIV.DIV_5V: g_CtrlByte1 &= 0xF7; g_CtrlByte1 |= 0x08; MyDLLimport.USBCtrlTrans(0x22, 0x00, 1); MyDLLimport.USBCtrlTrans(0x24, g_CtrlByte1, 1); break; default: break; } } else { switch (voltageDIV) { case EVoltageDIV.DIV_250MV: g_CtrlByte1 &= 0xF9; g_CtrlByte1 |= 0x04; //放大4倍 MyDLLimport.USBCtrlTrans(0x23, 0x40, 1); MyDLLimport.USBCtrlTrans(0x24, g_CtrlByte1, 1); break; case EVoltageDIV.DIV_500MV: g_CtrlByte1 &= 0xF9; g_CtrlByte1 |= 0x02; //放大两倍 MyDLLimport.USBCtrlTrans(0x23, 0x40, 1); MyDLLimport.USBCtrlTrans(0x24, g_CtrlByte1, 1); break; case EVoltageDIV.DIV_1V: g_CtrlByte1 &= 0xF9; g_CtrlByte1 |= 0x04; MyDLLimport.USBCtrlTrans(0x23, 0x00, 1); MyDLLimport.USBCtrlTrans(0x24, g_CtrlByte1, 1); break; case EVoltageDIV.DIV_2V5: g_CtrlByte1 &= 0xF9; g_CtrlByte1 |= 0x02; MyDLLimport.USBCtrlTrans(0x23, 0x00, 1); MyDLLimport.USBCtrlTrans(0x24, g_CtrlByte1, 1); break; case EVoltageDIV.DIV_5V: g_CtrlByte1 &= 0xF9; MyDLLimport.USBCtrlTrans(0x23, 0x00, 1); MyDLLimport.USBCtrlTrans(0x24, g_CtrlByte1, 1); break; default: break; } } } }
public void Start(EChannel nチャンネル番号, CDTX.CAVI rAVI, int n総移動時間ms, int n移動開始時刻ms) { //2016.01.21 kairera0467 VfW時代のコードを除去+大改造 Trace.TraceInformation("CActSelectBackgroundAVI: Start(): " + rAVI.strファイル名); this.rAVI = rAVI; #region [ アスペクト比からどっちを使うか判別 ] // 旧DShowモードを使っていて、旧規格クリップだったら新DShowモードを使う。 //if( CDTXMania.ConfigIni.bDirectShowMode == false ) { this.fClipアスペクト比 = ((float)rAVI.avi.nフレーム幅 / (float)rAVI.avi.nフレーム高さ); } //else //{ // this.fClipアスペクト比 = ( (float)dsBGV.dshow.n幅px / (float)dsBGV.dshow.n高さpx ); // if( this.fClipアスペクト比 < 1.77f ) // this.bUseMRenderer = false; //} #endregion if (nチャンネル番号 == EChannel.Movie || nチャンネル番号 == EChannel.MovieFull) { //CAviDS this.rAVI = rAVI; this.n総移動時間ms = n総移動時間ms; this.n移動開始時刻ms = (n移動開始時刻ms != -1) ? n移動開始時刻ms : CSoundManager.rcPerformanceTimer.nCurrentTime; if ((this.rAVI != null) && (this.rAVI.avi != null)) { //float f拡大率x; //float f拡大率y; this.framewidth = (uint)this.rAVI.avi.nフレーム幅; this.frameheight = (uint)this.rAVI.avi.nフレーム高さ; if (this.tx描画用 == null) { this.tx描画用 = new CTexture(CDTXMania.app.Device, (int)this.framewidth, (int)this.frameheight, CDTXMania.app.GraphicsDeviceManager.CurrentSettings.BackBufferFormat, Pool.Managed); } if (fClipアスペクト比 < 1.77f) { //旧規格クリップだった場合 float ratio1 = this.fullScreenWidthPx / ((float)this.frameheight); this.position = (int)((this.fullScreenHeightPx - (this.framewidth * ratio1)) / 2f); int num = (int)(this.framewidth * ratio1); if (num <= 565) { this.position = 295 + ((int)((565f - (this.framewidth * ratio1)) / 2f)); } else { this.position = 295 - ((int)(((this.framewidth * ratio1) - 565f) / 2f)); } this.tx描画用.vcScaleRatio.X = ratio1; this.tx描画用.vcScaleRatio.Y = ratio1; } else { //ワイドクリップの処理 float ratio1 = this.fullScreenHeightPx / ((float)this.framewidth); this.position = (int)((this.fullScreenWidthPx - (this.frameheight * ratio1)) / 2f); this.tx描画用.vcScaleRatio.X = ratio1; this.tx描画用.vcScaleRatio.Y = ratio1; } this.rAVI.avi.Run(); } } }
public static ImageSource ExtractChannelAndGetSource(string imagePath, EChannel channelToExtract, EChannel finalChannel, bool invert) => BitmapToImageSource(ExtractChannel(imagePath, channelToExtract, finalChannel, invert));