STNodeEditor/WinNodeEditerTest/Demo_Image/STNodeImageChannel.cs
2021-01-06 14:53:33 +08:00

58 lines
2.2 KiB
C#
Executable File

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
namespace ST.Library.UI.Demo_Image
{
public class STNodeImageChannel : STNodeImage
{
private STNodeOption m_out_r;
private STNodeOption m_out_g;
private STNodeOption m_out_b;
private Bitmap m_img_r;
private Bitmap m_img_g;
private Bitmap m_img_b;
protected override void OnCreate() {
base.OnCreate();
m_out_r = new STNodeOption("R", typeof(Image), false);
m_out_g = new STNodeOption("G", typeof(Image), false);
m_out_b = new STNodeOption("B", typeof(Image), false);
this.OutputOptions.Add(m_out_r);
this.OutputOptions.Add(m_out_g);
this.OutputOptions.Add(m_out_b);
this.Title = "Channel";
}
protected override void OnDataTransfer() {
base.OnDataTransfer();
if (m_img_r != null) {
m_img_r.Dispose();
m_img_g.Dispose();
m_img_b.Dispose();
m_img_r = m_img_g = m_img_b = null;
}
if (m_out_image.Data != null) { //分离通道 Demo 演示 Get/SetPixel() 效率极低 应当LockBitmap操作
Bitmap img = (Bitmap)base.m_input_image.Data;
m_img_r = new Bitmap(img.Width, img.Height);
m_img_g = new Bitmap(img.Width, img.Height);
m_img_b = new Bitmap(img.Width, img.Height);
for (int x = 0; x < img.Width; x++) {
for (int y = 0; y < img.Height; y++) {
Color clr = img.GetPixel(x, y);
m_img_r.SetPixel(x, y, Color.FromArgb(255, clr.R, clr.R, clr.R));
m_img_g.SetPixel(x, y, Color.FromArgb(255, clr.G, clr.G, clr.G));
m_img_b.SetPixel(x, y, Color.FromArgb(255, clr.B, clr.B, clr.B));
}
}
}
m_out_r.TransferData(m_img_r);
m_out_g.TransferData(m_img_b);
m_out_b.TransferData(m_img_b);
}
}
}