Fragen zu Drawing.Image und WebControls.Image

rainerdam

Mitglied
Tach zusammen,
ich will grad fuer meine Seite eine Photogallery machen.
Nun haben sich verschiedenste Fragen angehaeuft, die sich alle um Images drehen.

Wo liegt denn der Unterschied zwischen System.Drawing.Image und Ui.WebControls.Image ?
Wann benutze ich welches, was sind Vor-und Nachteile oder kann man das gar nicht vergleichen?

Ich will die Pfadnamen der Photos in eine DB schreiben und diese Bilder sollen dann dargestellt werden.
Dies koennte ja so machen:
Code:
String Sql = "SELECT pfad FROM bilder";
			
OleDbCommand OCommand = new OleDbCommand(Sql,connect());
		
OleDbDataReader OReader;
OReader = OCommand.ExecuteReader(); 
	while (OReader.Read())
		{
		System.Web.UI.WebControls.Image bild = new WebControls.Image();
		bild.ImageUrl = (OReader["pfad"].ToString();
		PlcHolder.Controls.Add(bild);
		}

aber ich will, dass zu erst nur die Thumbnails dargestellt werden und erst nach dem anklicken das ganze Bild.

WENN ich das richtig sehe, dann hat nur Drawing.Image diese getthumbnail Methode.

Ich versteh aber nicht, wie ich ein Drawing.Image Objekt auf der Seite darstelle.
Bis jetzt hab ich nur diese Moeglichkeit gefunden:
Code:
Response.Clear();
Response.ContentType = "image/jpeg";
imgThumb.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
imgThumb.Dispose();
Response.End();*/

Aber da wird das Bild als neue Seite zurueck gegeben. Ich will aber alle Thumbnails auf einer Seite darstellen.

Also ihr seht, ich bin ziemlich verwirrt, hoffe ihr koennt ein bisschen Licht ins Dunkel bringen.
Aus meiner sicht gaebe es zwei Moeglichkeiten, entweder das WebControls.Image Objekt kann auch zu erst Thumbnails darstellen oder ich schaff es verschiedene Drawing.Image Objekte auf einer Seite darzustellen.
Vielleicht lieg ich ja auch voellig falsch und ihr habt mir ne bessere Idee.

Danke schoen

tschoe

RAiner
 
danke schoen,
Habs mir mal angekuckt und es geht auf jeden Fall in die richtige Richtung.
Es ist allerdings fast ein bisschen zu viel fuer mich, werd auch ncoh ein bisschen brauchen, bis ich alles verstanden hab (auch weils VB ist).

Ich bin allerdings immer noch guter Hoffnung, dass ich das auch selber hin bekomm, wenn jemand meine anderen Fragen beanworten kann.

Es geht vorallem darum verschiedene Drawing.Image Objekte nebeneinander darzustellen, wie bekomm ich das hin?
 
Du kannst die Images wie in dem Beispiel beschrieben im DataGrid platzieren oder dir dynamisch einen Table aufbauen.
Du könntest beim Table dann z.B. aus einer Collection die Images auslesen und für jedes Image eine neue Spalte generieren mit fester Breite.
Ebenfalls kannst du mal schauen, ob man mit CSS zusätzliche Attribute manipulieren kann, die dir weiterhelfen.
 
Ja das mit der Tabelle war auch meine Urspruengliche Idee und jetzt brauch ich nur noch den Code um das Imageobjet zu erstellen und vorallem darzustellen, da haengt es bei mir.

z.B.
Code:
Response.Write ("<table><tr><td>");
 System.Drawing.Image newImage = System.Drawing.Image();

 // was muss hier jetzt hin um newImage darzustellen

Response.Write("</td></tr></table>");
 
Du solltest Dich zuerst einmal mit den Grundsätzlichen Dingen des HTTP-Protokolls beschäftigen! Denn die Ausgabe von html-Quelltext und eines Bildes ist auf keine Fall innerhalb eines Scriptes möglich
Es muss immer ein Script da sein, welches den HTML-Quellcode (auf welche Art auch immer) für ein Bild erzeugt
Code:
<table>
<tr>
<td><img src="bild.aspx"></td>
</tr>
</table>

und ein Script (bild.aspx) welches das Bild ausgibt.

Code:
Response.ContentType = "image/jpeg";
...


Grund dafür:

das Script welches den HTML-Code erzeugt, hat bereits den ContentType text/html an den Browser gesendet und ist nicht mehr in der Lage ein Bild direkt auszuliefern!
 
stefankret hat gesagt.:
Du solltest Dich zuerst einmal mit den Grundsätzlichen Dingen des HTTP-Protokolls beschäftigen! Denn die Ausgabe von html-Quelltext und eines Bildes ist auf keine Fall innerhalb eines Scriptes möglich
Es muss immer ein Script da sein, welches den HTML-Quellcode (auf welche Art auch immer) für ein Bild erzeugt
Code:
<table>
<tr>
<td><img src="bild.aspx"></td>
</tr>
</table>

und ein Script (bild.aspx) welches das Bild ausgibt.

Code:
Response.ContentType = "image/jpeg";
...


Grund dafür:

das Script welches den HTML-Code erzeugt, hat bereits den ContentType text/html an den Browser gesendet und ist nicht mehr in der Lage ein Bild direkt auszuliefern!

Ne ich habs auch ohne das grundsaetzliche Wissen ueber das HTTP Protokoll geschafft. Nachdem ich gemerkt hab, dass man auch mitm WebControls.Image Objekt problemlos Thumbnails erstellen kann. Aber falls dein HTTP Wissen, da noch was sieht was verbessert werden kann, nehm ich den Tip gern an.
Code:
// Verbindung zur DB, fuellen des DataSet und herstellung einer DataRelation
dann:


DataTable dt = new DataTable();
			dt = DSet.Tables["Bilder"];
			PlcHolder.Controls.Add(new LiteralControl("<table border=0 cellpadding=5 width=100% id=photolink><tr>"));
			int i = 0;
			foreach (DataRow dr1 in dt.Rows)
			{	
				

				bildnr = 0;
				string imgurl = "photos\\mitarbeiter\\m" + dr1["id"]+ ".jpg";
				

				PlcHolder.Controls.Add(new LiteralControl("<td align=center>"));
					
				System.Drawing.Image bildg = System.Drawing.Image.FromFile(Server.MapPath(imgurl));
				double bildwidth = bildg.Width + 50;
				string width = bildwidth.ToString();

				System.Web.UI.WebControls.Image myImage = new  System.Web.UI.WebControls.Image();
				myImage.ImageUrl = imgurl;
									
				myImage.Width = 120;
				myImage.BorderWidth = 1;


				PlcHolder.Controls.Add(myImage);
				PlcHolder.Controls.Add(new LiteralControl("<br>"));
				System.Web.UI.WebControls.HyperLink link = new HyperLink();
				link.NavigateUrl = "javascript:void(window.open(\"photodetail.aspx?bild="+ dr1["id"]+ "&pfad=mitarbeiter\",\"Großansicht\",\"width="+width+", location=no, menubar=no,status=no,scrollbars=yes,toolbar=no\")) ";
				link.ID = "photolink";
				link.Text = "[groß]";
				PlcHolder.Controls.Add(link);

					foreach (DataRow dr2 in dr1.GetChildRows(relCustOrder))
					{
						if (dr2["bildnr"].ToString() == dr1["id"].ToString())
						{
							bildnr++;
						}
						
					}
					
				System.Web.UI.WebControls.HyperLink linkc = new HyperLink();
				linkc.NavigateUrl = "javascript:void(window.open(\"commentsdetail.aspx?bild="+ dr1["id"]+ "&pfad=mitarbeiter\",\"Kommentare\",\"width=500, location=no, menubar=no,status=no,scrollbars=yes,toolbar=no\"))";
				linkc.ID = "photolink";
				if (bildnr == 1)
				{
					linkc.Text = "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[" +bildnr +" Kommentar]";
				}
				else
				{
					linkc.Text = "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[" +bildnr +" Kommentare]";
				}
					PlcHolder.Controls.Add(linkc);
				
				PlcHolder.Controls.Add(new LiteralControl("</td>"));
				
				i++;
				
				if (i % 4 == 0)
				{
					PlcHolder.Controls.Add(new LiteralControl("</tr><tr>"));
						
				}
			
			}
											
				PlcHolder.Controls.Add(new LiteralControl("</tr></table>"));
		}
 
OK, das wäre der eine Teil. Das Bild wird natürlich angezeigt, es wurde ja auch entsprechender HTML-Qellcode generiert, in welchem das Bild per width und height verkleinert wird. Allerdings als Source das normale Bild. Somit wird zwar das Bild klein angezeigt, aber übertragen wird es in seiner eigentlichen Größe. Und das hat mit einem Thumbnail nicht wirklich was zu tun. Hast du jetzt auf deiner Seite 50 "Thumbnails", wo die eigentlichen Bilder vielleicht 1 MB (eine gute Photographie, bei 1280*1024) groß sind, werden, obwohl die Bilder ja nur klein dargestellt werden, 50 MB übertragen .... viel Spass bei der Trafficabrechnung ...

MfG

Stefan
 
jaja, darueber hab ich auch schon nachgedacht, aber da mir niemand wirklich weiter helfen konnte hab ich mich damit erstmal zufrieden gegeben. Ausserdem werden die Bilder ganz sicher nicht 1 mb gross oder so, ich muss im Web nicht die absolut beste Qualitaet anbieten.
Ich denke das duerfte vom Traffic durchaus gehen.
Wenns zu viel wird, werd ich halt die Thumbnails per Hand (bzw. per Stapelverarbeitung im Photoshop) erstellen, dann ist es auch kein Problem.

Du kannst mir aber auch einfach gern sagen, wie ich verschiedene Drawing.Image Objekte nebeneinander darstelle.
 
Das ist es doch. In einem Drawing.Image Objekt steckt das Bild mit seinen Binärdaten, seinen Eigenschaften usw. Davon kannst du nicht mehrere innerhalb eines Scriptes an den Browser senden. In deinem Script machst du das ja auch nicht. Du verwendest ja nur die width Eigenschaft des Objektes. Aber du sendest die eigentlichen Bilddaten nicht!
 

Neue Beiträge

Zurück