A shell for Google's image search

A program that searches on Google's Image Search.

/*
* by Mike H (GbaGuy) - http://k2pts.home.comcast.net/gbaguy/
*        [email protected]
*
* I don't care what you do with this. GPL.
*
* All the calls to GC.Collect() are probably unnecessary, but
* then again so are the dialog boxes that say "error: out of memory"...
*/
using System;
using System.Windows.Forms;
using System.IO;
using System.Net;
using System.Collections;
using System.Drawing;
using System.Diagnostics;
class ImageSearch : Form {
    string searchstring = "http://images.google.com/images?hl=en&lr=&ie=UTF-8&oe=UTF-8&safe=off&q=";
    string alternatesearch = "http://images.google.com/images?q=SEARCH&svnum=10&hl=en&lr=&ie=UTF-8&oe=UTF-8&safe=off&filter=0";
    string resultpage = "";
    string startoftable = "table align=center border=0 cellpadding=5 cellspacing=0";
    string moreimglink = "http://images.google.com/images?q=SEARCH&svnum=10&hl=en&lr=&ie=UTF-8&oe=UTF-8&safe=off&start=SET&sa=N";
    int seto20 = 0;
    ArrayList thumbs = new ArrayList();
    ArrayList googlethumbs = new ArrayList();
    ArrayList links = new ArrayList();
    ArrayList gtsizes = new ArrayList();
    ArrayList labels = new ArrayList();
   
    TextBox urlTB = new TextBox();
    string searchtext = "";
   
    MenuItem mnuOptions = new MenuItem("Options");
    MenuItem mnuNext = new MenuItem("Next");
    MenuItem mnuPrev = new MenuItem("Previous");
   
    private void next20(object s,EventArgs e) {
        seto20 += 20;
        try {
            search();
        } catch(Exception d) {
            d=d;
            seto20 -= 20;
            MessageBox.Show("No more pics.","Error");
        }
    }
   
    private void prev20(object s, EventArgs e) {
        if(seto20!=0) {
            seto20 -= 20;
        } else {
            MessageBox.Show("Can't go back.","Error");
            return;
        }
        try {
            search();
        } catch(Exception d) {
            d=d;
            MessageBox.Show("Can't go back.","Error");
        }
    }
   
    public ImageSearch() {
        urlTB.Dock = DockStyle.Top;
        urlTB.Multiline = true;
        urlTB.KeyDown += new KeyEventHandler(Key_Down);
        this.Controls.Add(urlTB);
        this.Text = "Image Search (Powered by Google)";
        this.WindowState = FormWindowState.Maximized;
        this.Menu = new MainMenu();
        this.Menu.MenuItems.Add(mnuOptions);
        mnuOptions.MenuItems.Add(mnuNext);
        mnuOptions.MenuItems.Add(mnuPrev);
        mnuNext.Click += new EventHandler(next20);
        mnuPrev.Click += new EventHandler(prev20);
        this.Show();
    }
       
    private void Key_Down(object s,KeyEventArgs e) {
        if(Keys.Enter==e.KeyCode) {
            e.Handled = true;
            seto20 = 0;
            searchtext = urlTB.Text;
            search();
            urlTB.Clear();
        }
    }
   
    private void search() {
        foreach(Label c in labels) {
            c.Image = null;
            c.Visible = false;
            c.Dispose();
        }
        Application.DoEvents();
        System.GC.Collect();
        Application.DoEvents();
        System.GC.Collect();
        googlethumbs = new ArrayList();
        thumbs = new ArrayList();
        links = new ArrayList();
        gtsizes = new ArrayList();
        WebClient WC = new WebClient();
        byte[] data = null;
        if(seto20!=0)
            data = WC.DownloadData(moreimglink.Replace("SEARCH",searchtext.Replace(" ","+")).Replace("SET",seto20.ToString()));
        else
            data = WC.DownloadData(searchstring + urlTB.Text.Replace(" ","+"));
        WC.Dispose();
        System.Text.ASCIIEncoding AE = new System.Text.ASCIIEncoding();
        resultpage = AE.GetString(data, 0, data.Length);
        resultpage = resultpage.Substring(resultpage.IndexOf(startoftable)+startoftable.Length);
        try {
            resultpage = resultpage.Substring(0,resultpage.IndexOf("Result Page: ));
        } catch(Exception e44) {
            e44=e44;
            WebClient Wc = new WebClient();
            byte[] daTa = Wc.DownloadData(alternatesearch.Replace("SEARCH",urlTB.Text.Replace(" ","+")));
            Wc.Dispose();
            System.Text.ASCIIEncoding Ae = new System.Text.ASCIIEncoding();
            resultpage = Ae.GetString(daTa, 0, daTa.Length);
            resultpage = resultpage.Substring(resultpage.IndexOf(startoftable)+startoftable.Length);
        }
        parse();
        //WriteToFile();
        resultpage = null;
        showIMGs();
    }
   
    private void showIMGs() {
        int x = 5;
        int y = 20;
        int largestY = 0;
        if(!Directory.Exists(@"C:\pics"))
            Directory.CreateDirectory(@"C:\pics");
        for(int i=0;i<thumbs.Count;i++) {
            Application.DoEvents();
            Label l = new Label();
            WebClient WC = new WebClient();
            try {
                byte[] im = WC.DownloadData((string)googlethumbs[i]);
                WC.Dispose();
                BinaryWriter BW = new BinaryWriter(new StreamWriter(@"C:\pics\" + i.ToString() + ".jpg").BaseStream);
                BW.Write(im);
                BW.BaseStream.Close();
                BW.Close();
                BW = null;
                WC = null;
               
            } catch(Exception er) {
                er=er;
                Console.WriteLine("ERROR: Can't d/l '" + googlethumbs[i] + "'.");
                continue;
            }
            l.Image = Image.FromFile(@"C:\pics\" + i.ToString() + ".jpg");
            l.Image = l.Image.GetThumbnailImage(((Size)gtsizes[i]).Width,((Size)gtsizes[i]).Height,null,new IntPtr(0));
            l.Width = l.Image.Width;
            l.Height = l.Image.Height;
            if(l.Height>largestY)
                largestY = l.Height;
            l.Location = new Point(x,y);
            x += l.Width + 5;
            if(x>800) {
                x = 5;
                y += largestY + 5;
            }
            l.Tag = i;
            Console.WriteLine(i);
            l.MouseDown += new MouseEventHandler(showstuff);
            this.Controls.Add(l);
            labels.Add(l);
            WC = null;
            Application.DoEvents();
        }
        Application.DoEvents();
        System.GC.Collect();
        Application.DoEvents();
        System.GC.Collect();
    }
   
    private void showstuff(object s,MouseEventArgs e) {
        if(System.Windows.Forms.MouseButtons.Right==e.Button) {
            Label l = (Label)s;
            Process.Start(@"C:\program files\internet explorer\iexplore.exe",(string)links[(int)l.Tag]);
        } else {
            Label l = (Label)s;
            WebClient WC = new WebClient();
            try {
                WC.OpenRead((string)thumbs[(int)l.Tag]).Close();
                WC.Dispose();
                Process.Start(@"C:\program files\internet explorer\iexplore.exe",(string)thumbs[(int)l.Tag]);
            } catch(Exception e44) {
                e44=e44;
                Process.Start(@"C:\program files\internet explorer\iexplore.exe",(string)links[(int)l.Tag]);
            }
        }
    }
   
    private void parse() {
        string k = resultpage;
        for(int i=0;i<k.Length;i++) {
            if(k[i]=='<'&&k[i+1]=='a') {
                Application.DoEvents();
                if(k.Substring(i,23)=="<a href=/imgres?imgurl=") {
                    i += 23;
                    string t = k.Substring(i,k.IndexOf("&",i)-i);
                    i = k.IndexOf("&imgrefurl=",i) + 11;
                    string l = k.Substring(i,k.IndexOf("&",i)-i);
                    i = k.IndexOf("img src=/images?q=tbn:",i) + 22;
                    string gt = "http://images.google.com/images?q=tbn:" + k.Substring(i,k.IndexOf(":",i)-i);
                    i = k.IndexOf("width=",i) + 6;
                    int w = Int32.Parse(k.Substring(i,k.IndexOf(" ",i)-i));
                    i = k.IndexOf("height=",i) + 7;
                    int h = Int32.Parse(k.Substring(i,k.IndexOf(">",i)-i));
                    gt += ":" + t;
                    googlethumbs.Add(gt);
                    thumbs.Add("http://" + t);
                    links.Add(l);
                    gtsizes.Add(new Size(w,h));
                }
            }
            Application.DoEvents();
            System.GC.Collect();
        }
    }
   
    private void WriteToFile() {
        StreamWriter SW = new StreamWriter("testgi.htm");
        SW.WriteLine(resultpage);
        SW.Close();
        SW = null;
    }
   
    public static void Main() {
        Application.Run(new ImageSearch());
    }
}

You might also like...

Comments

Michael H

Contribute

Why not write for us? Or you could submit an event or a user group in your area. Alternatively just tell us what you think!

Our tools

We've got automatic conversion tools to convert C# to VB.NET, VB.NET to C#. Also you can compress javascript and compress css and generate sql connection strings.

“PHP is a minor evil perpetrated and created by incompetent amateurs, whereas Perl is a great and insidious evil perpetrated by skilled but perverted professionals.” - Jon Ribbens