skit091 0 Newbie Poster

Main form coding ;-

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace CS3DGeneratorSample
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

    private void link_Image_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
    {
        OpenFileDialog.Title = "Open Image";
        if (OpenFileDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
        {
            pn_image.BackgroundImage = Image.FromFile(OpenFileDialog.FileName);
        }
    }

    private void link_Depth_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
    {
        OpenFileDialog.Title = "Open DepthMap";
        if (OpenFileDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
        {
            pn_depth.BackgroundImage = Image.FromFile(OpenFileDialog.FileName);
        }
    }


    private void but_anag_Click(object sender, EventArgs e)
    {
        _3DImageGenerator.c_3DGenerator gen = Init3DGenerator();
        if (gen == null)
            return;

        pb_loading.Visible = true;
        gen.GenerateAnaglyphAsync((Bitmap)pn_image.BackgroundImage, (Bitmap)pn_depth.BackgroundImage, gen);
    }

    private void AnaglypthFinished(bool success, object usercode)
    {
        if (success == false)
        {
            MessageBox.Show("Failed!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
        else
        {
            pn_output.BackgroundImage = ((_3DImageGenerator.c_3DGenerator)usercode).Anaglyph;
            link_output.Tag = usercode;
        }
        pb_loading.Visible = false;
    }



    private _3DImageGenerator.c_3DGenerator Init3DGenerator()
    {
        if (pn_image.BackgroundImage == null || pn_depth.BackgroundImage == null)
        {
            MessageBox.Show("You must select Image and Depthmap before generating.","Error",MessageBoxButtons.OK,MessageBoxIcon.Error);
            return null;
        }
        _3DImageGenerator.c_3DGenerator gen = new _3DImageGenerator.c_3DGenerator();
       // gen.Smoothing = cb_smoothing.Checked;
        gen.MaxPixelDisplacement = (int)nud_maxdisp.Value;
       // gen.SwapRightLeft = cb_swap.Checked;
       // gen.InverseDepthMap = cb_inverse.Checked;
        gen.AnaglyphComplete += AnaglypthFinished;
       // gen.StereoscopicComplete += StereoscopicFinished;
        return gen;
    }

    private void link_output_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
    {
        if (((LinkLabel)sender).Tag != null)
        {
            _3DImageGenerator.c_3DGenerator gen = ((_3DImageGenerator.c_3DGenerator)((LinkLabel)sender).Tag);
            if (gen.Anaglyph != null)
            {
                SaveFileDialog.Title = "Save Anaglyph";
                SaveFileDialog.FileName = "";
                SaveFileDialog.Filter = "Jpg File|*.jpg|BMP File|*.bmp|PNG File|*.png";
                if (SaveFileDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {

                    switch (System.IO.Path.GetExtension(SaveFileDialog.FileName).ToLower().Trim())
                    {
                        case "png":
                            gen.SaveAnaglyph(SaveFileDialog.FileName, System.Drawing.Imaging.ImageFormat.Png);
                            break;
                        case "bmp":
                            gen.SaveAnaglyph(SaveFileDialog.FileName, System.Drawing.Imaging.ImageFormat.Bmp);
                            break;
                        default:
                            gen.SaveAnaglyph(SaveFileDialog.FileName, System.Drawing.Imaging.ImageFormat.Jpeg , 100);
                            break;
                    }
                }
            }
            else
            {

            }
        }

    }

    private void pb_loading_Click(object sender, EventArgs e)
    {

    }



}

}

this is another file in vb to connect

Imports System.Runtime.InteropServices.Marshal
Imports System.Drawing.Imaging
Imports System.Drawing

Public Class c_3DGenerator
Private i_maxDisplacement As Integer = 12

Private b_Anaglyph As Bitmap

Private b_SwapRL As Boolean = False

Public Event AnaglyphComplete(ByVal Success As Boolean, ByVal userCode As Object)

Public Sub New()
    '' Nothing to do
End Sub
Public Sub GenerateAnaglyphAsync(ByVal Image As Bitmap, ByVal DepthMap As Bitmap, ByVal userCode As Object)
    '' Creating a thread for doing work in background. It will raise AnaglyphComplete when opration ended
    Dim th As Threading.Thread = New Threading.Thread(Sub()
                                                          Dim success As Boolean = GenerateAnaglyph(Image, DepthMap)
                                                          For Each del As System.Delegate In AnaglyphCompleteEvent.GetInvocationList()
                                                              If (del.Target Is Nothing OrElse CType(del.Target, ComponentModel.ISynchronizeInvoke).InvokeRequired = False) Then
                                                                  del.DynamicInvoke(New Object() {success, userCode})
                                                              Else
                                                                  CType(del.Target, ComponentModel.ISynchronizeInvoke).Invoke(del, New Object() {success, userCode})
                                                              End If
                                                          Next
                                                      End Sub)
    '' Starting thread
    th.Start()
End Sub

Public Function GenerateAnaglyph(ByVal Image As Bitmap, ByVal DepthMap As Bitmap) As Boolean
    '' Checking if image and depthmap have same size
    If Image.Width <> DepthMap.Width OrElse Image.Height <> DepthMap.Height Then Throw New ArgumentException("Size of Image and DepthMap are not same.")
    '' Check if image and depthmap are 24bitRGB or not
    If Image.PixelFormat <> PixelFormat.Format24bppRgb OrElse Image.PixelFormat <> PixelFormat.Format24bppRgb Then Throw New ArgumentException("Image and/or DepthMap are/is not 24bitRGB")
    Try
        '' Locking image and depthmap so other threads cant access them when we work
        SyncLock Image : SyncLock DepthMap
                '' Create a clean bitmap for saving output
                b_Anaglyph = New Bitmap(DepthMap.Width, Image.Height)
                '' Create a rect object, Same size as bitmap. Need for direct access in memory
                Dim r_Anaglyph As Rectangle = New Rectangle(0, 0, DepthMap.Width, Image.Height)
                '' Calculating real width of image (By byte)
                Dim i_width As Integer = DepthMap.Width * 3
                If i_width Mod 4 <> 0 Then
                    i_width = 4 * (i_width / 4 + 1)
                End If

                '' How much we need to move each pixel per depth byte
                Dim hsrate As Double = i_maxDisplacement / 255

                '' Creating a rect object with same size. For Depth map
                Dim r_depth As Rectangle = New Rectangle(0, 0, DepthMap.Width, DepthMap.Height)
                '' Opening direct access to bitmap data in memory for Depth map
                Dim d_depth As BitmapData = DepthMap.LockBits(r_depth, ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format24bppRgb)

                '' Creating a rect object with same size. For Image
                Dim r_image As Rectangle = New Rectangle(0, 0, Image.Width, Image.Height)
                '' Opening direct access to bitmap data in memory for Image
                Dim d_image As BitmapData = Image.LockBits(r_image, ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format24bppRgb)

                '' Opening direct access to bitmap data in memory for Output Bitmap
                Dim d_anag As BitmapData = b_Anaglyph.LockBits(r_Anaglyph, ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format24bppRgb)

                Dim sfp As Integer
                For y As Integer = 0 To DepthMap.Height - 1

                    '' Calculate location of current line's last free pixel
                    Dim rLPDest As IntPtr = (y + 1) * i_width - (i_maxDisplacement * 3) - 3

                    '' Calculate location of current line's first free pixel
                    Dim rFPDest As IntPtr = y * i_width + (i_maxDisplacement * 3)

                    '' Count for each pixel on width of image. Cut MaxDisplacementfrom both sides
                    For x As Integer = i_maxDisplacement To DepthMap.Width - 1 - i_maxDisplacement

                        '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Right 2 Left  <<--
                        '' Read Depth, Right to Left
                        Dim depthrgb As Byte = ReadByte(d_depth.Scan0 + rLPDest + 1)
                        If InverseDepthMap Then depthrgb = 255 - depthrgb

                        '' Calculate displacement offset, Right to Left
                        sfp = depthrgb * hsrate

                        '' Read BYTE from Image And Displace, Right to Left
                        If (Not b_SwapRL) Then
                            '' RED
                            WriteByte(d_anag.Scan0 + rLPDest + ((sfp) * 3) + 2, ReadByte(d_image.Scan0 + rLPDest + 2))
                        Else
                            '' BLUE
                            WriteByte(d_anag.Scan0 + rLPDest + ((sfp) * 3), ReadByte(d_image.Scan0 + rLPDest))
                            '' Read GREEM And Displace it just like BLUE
                            WriteByte(d_anag.Scan0 + rLPDest + ((sfp) * 3) + 1, ReadByte(d_image.Scan0 + rLPDest + 1))
                        End If



                    Next
                Next



                '' Closing direct access
                DepthMap.UnlockBits(d_depth)
                Image.UnlockBits(d_image)
                b_Anaglyph.UnlockBits(d_anag)
            End SyncLock : End SyncLock
        Return True
    Catch ex As Exception
        Return False
    End Try
End Function

Public ReadOnly Property Anaglyph As Bitmap
    Get
        Return b_Anaglyph
    End Get
End Property


Public Property MaxPixelDisplacement As Integer
    Get
        Return i_maxDisplacement
    End Get
    Set(ByVal value As Integer)
        i_maxDisplacement = value
    End Set
End Property

Public Property SwapRightLeft As Boolean
    Get
        Return b_SwapRL
    End Get
    Set(ByVal value As Boolean)
        b_SwapRL = value
    End Set
End Property

finally you can get 3d image

i m rohit gupta
my project was 2d to 3d image conversion
thanks..

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.