We need you!

We're working hard on the next version of Developer Fusion. Let us know what you think we should be up to!

Members

Technology Zones

Articles

Hosted By

MaximumASP

Info

Rated
Read 16,143 times

Downloads

Related Categories

A shell for Google's image search

Michael H

A program that searches on Google's Image Search.

/*
* by Mike H (GbaGuy) - http://k2pts.home.comcast.net/gbaguy/
*        vbnetprogramer@hotmail.com
*
* 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());
    }
}

Comments

  • Out of Memory errors...

    Posted by belayon on 27 Aug 2005

    Greetings,
    I notice in your code sample that you force a Garbage Collection frequently and comment about 'Out of Memory' errors when calling Image.GetThummbnailImage(...);

    I, too, have been having...