Para descomponer un Bitmap de tres canales (RGB) en tres Bitmaps que representen cada uno, un canal del Bitmap original, podemos hacer lo siguiente:
rgb = new Bitmap("imagen.bmp"); int width = rgb.Width; int height = rgb.Height; Bitmap channelRed = new Bitmap(width, height); Bitmap channelGreen = new Bitmap(width, height); Bitmap channelBlue = new Bitmap(width, height); for(int x = 0; x < width; x++) { for(int y = 0; y < height; y++) { Color color = rgb.GetPixel(x, y); Color colorRed = Color.FromArgb(color.R, color.R, color.R); Color colorGreen = Color.FromArgb(color.G, color.G, color.G); Color colorBlue = Color.FromArgb(color.B, color.B, color.B); channelRed.SetPixel(x, y, colorRed); channelGreen.SetPixel(x, y, colorGreen); channelBlue.SetPixel(x, y, colorBlue); } }
De esta forma, obtenemos 3 bitmaps, cada uno en blanco y negro y representando la tonalidad de cada canal:
Esto se ve así, porque ocupamos cada canal, de cada imagen, con el canal que obtuvimos previamente. Es decir, extrajimos el canal rojo de la imagen original, y grabamos todos los canales de channelRed con ese componente. Al tener cada canal el mismo valor, se ve gris. Si quisieramos que cada imagen contenga únicamente el valor del canal que extraemos, tendríamos que dejar los otros dos canales en cero. Cambiemos entonces la parte del código que asigna los colores:
Color color = rgb.GetPixel(x, y); Color colorRed = Color.FromArgb(color.R, 0, 0); Color colorGreen = Color.FromArgb(0, color.G, 0); Color colorBlue = Color.FromArgb(0, 0, color.B);
Y lo que obtenemos es esto:
Si bien el resultado es el esperado, esta forma no es precisamente rápida. En caso de imágenes más grandes, el proceso tarda más, y más. Y ni hablar si queremos operar con estos valores. Hay, claro, formas de trabajar con esto mucho más rápido, en otro momento las veremos.
haaa no me salio no entiendo si lo tengo igual en que estoy fallando
ResponderEliminarsing System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Drawing.Imaging;
namespace tarea1_3erpar
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void OriginalPicture_Click(object sender, EventArgs e)
{
}
private void Form1_Load(object sender, EventArgs e)
{
OpenFileDialog pf = new OpenFileDialog();
pf.ShowDialog();
Bitmap mapa = new Bitmap(pf.FileName);
///OriginalPicture.Image = Image.FromFile(pf.FileName);
OriginalPicture.Image = mapa;
int width = OriginalPicture.Width;
int height = OriginalPicture.Height;
int x, y;
//creamos los tres bitmap para cada color red green y blue
Bitmap rmapa = new Bitmap(mapa);
Bitmap gmapa = new Bitmap(mapa);
Bitmap bmapa = new Bitmap(mapa);
//Vamos a crear un ciclo que nos va a permitir ver en cada imagen transformada a rojo ,verde y azul(red, green and blue respectivamente)
for ( x = 0; x < height ; x++);
{
for ( y = 0; y < width; y++);
{
//obtener el valor de píxel
Color p = mapa.GetPixel(x , y);
//extraer el valor de ARGB para p
//int r = p.R;
//int g = p.G;
//int b = p.B;
//establecer pixel de imagen rojo
Color Red = Color.FromArgb(p.R, 0, 0);
Color Green = Color.FromArgb(0, p.G, 0);
Color Blue = Color.FromArgb(0, 0, p.B);
// rmapa.SetPixel(x, y, Red);
// gmapa.SetPixel(x, y, Green);
//bmapa.SetPixel(x, y, Blue);
}
}
pictureBox1.Image = rmapa;
pictureBox2.Image = gmapa;
pictureBox3.Image = bmapa;
//rmapa.Save("C:\\Users\\tatyg\\Documents\\tese\\graficacion\\graficación cotarelo\\terecer parcial\\tareas\\tarea1_3erpar\\red.jpg");
}
}
}