webForumDet fria alternativet

ASP -> ASP.NET Bild uppladdning

.NET

15 svar · 625 visningar · startad av thevice

Medlem sedan dec. 2005198 inlägg
Frågan#1

Hej!

Satt och klurade ett bra tag när jag höll på med ASP för att få koden att fungera, nu har jag gått över till .NET och att fixa det som jag gjorde i ASP är ren grekiska för mig.

Jag använder mig utav C# och skulle vilja ha lite guidening för att kunna fixa det här.

Först för att ladda upp en bild gjorde jag så här:

// Kollar om det finns en mapp med användarens ID i Upload mappen. Om det inte finns så läggs en till.

Set objFSO = Server.CreateObject("Scripting.FileSystemObject")
	If Not objFSO.FolderExists(Server.MapPath("/upload/" & intUserID)) Then
		objFSO.CreateFolder(Server.MapPath("/upload/" & intUserID))
	End if
Set objFSO = Nothing

// Jag vill att max storleken ska vara 2mb.
Call dbOpen(Connect)
	Set objUpload = Server.CreateObject("Persits.Upload")
	objUpload.SetMaxSize 200000, True
	objUpload.OverwriteFiles = True
	objUpload.SaveToMemory	
		For Each File In objUpload.Files			
			If LCase(File.ImageType) = "jpg" Or LCase(File.ImageType) = "jpeg" Or LCase(File.ImageType) = "bmp" Or LCase(File.ImageType) = "gif" Then
				If Not File.ImageWidth < "100" Or Not File.ImageHeight < "100" Then
					File.SaveAs Server.MapPath("/upload/" & intUserID & "/" & intUserID & "_tmp.jpg")
				Else
					Session("strAlert") = "Bilden måste vara MINST 100x100px!"
					Response.Redirect "?p=image_settings" 
				End If
			Else
				Session("strAlert") = "Fel filformat!"
				Response.Redirect "?p=image_settings" 
			End If
		Next
	Set objUpload = Nothing

Efter detta så kommer man till en sida där man ska skala bilden, jag vill då skala bilden med hjälp av x,y, widht och height:

	intStartX = Request.Querystring("intX")
	intStartY = Request.Querystring("intY")
	intWidth = Request.Querystring("intWidth")
	intHeigh = Request.Querystring("intHeight")
		Set objImage = Server.CreateObject("AspImage.Image")
			objImage.LoadImage(Server.MapPath("/upload/" & intUserID & "/" & intUserID & "_tmp.jpg"))
			objImage.FileName = (Server.MapPath(LCase("/upload/" & intUserID & "/" & intUserID & "_large.jpg")))
			objImage.ImageFormat = 1
			objImage.JPEGQuality = 30
			objImage.AutoSize = True
			objImage.CropImage intStartX, intStartY, intWidth, intHeigh	
			objImage.SaveImage
			
			objImage.LoadImage(Server.MapPath("/upload/" & intUserID & "/" & intUserID & "_large.jpg"))
			objImage.FileName = (Server.MapPath(LCase("/upload/" & intUserID & "/" & intUserID & "_small.jpg")))
			objImage.Resize 34,44
			objImage.SaveImage
			
			Set objFSO = Server.CreateObject("Scripting.FileSystemObject")
				If objFSO.FileExists(Server.MapPath(LCase("/upload/" & intUserID & "/" & intUserID & "_tmp.jpg"))) Then
					objFSO.DeleteFile Server.MapPath(LCase("/upload/" & intUserID & "/" & intUserID & "_tmp.jpg"))
				Else
					Response.Redirect(Request.ServerVariables("HTTP_REFERER"))
				End If					
			Set objFSO = Nothing
		Set objImage = Nothing

Jag begär naturligtvis inte att ni ska skriva hela koden åt mig, men lite hjälp, tips och artiklar skulle inte vara fel.

Tack på förhand!
/ Timmie

Medlem sedan dec. 19996 721 inlägg
Medlem sedan feb. 2005280 inlägg
Medlem sedan dec. 2005198 inlägg
#4

Jag får inte till det med crop-saken:

int x = 0;
int y = 0;
int w = 190;
int h = 244;

string strFilename = Server.MapPath("Upload/" + Convert.ToString(Session["intID"]) + "/" + Convert.ToString(Session["intID"]) + ".jpg");

System.Drawing.Image i = System.Drawing.Image.FromFile(strFilename);
System.Drawing.Image b = new System.Drawing.Bitmap(i.Width, i.Height, PixelFormat.Format24bppRgb);

int sheight = i.Height;
int swidth = i.Width;
int sx = 0;
int sy = 0;

Graphics g = Graphics.FromImage(b);
g.DrawImage(i, 0, 0, new Rectangle(x, y, w, h), GraphicsUnit.Pixel);

Response.ContentType = "image/jpeg";
b.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
b.Dispose();

När jag har klickat på knappen som anropar skriptet så syns bilden, fast det blir ju inte som jag vill. Bilden är i orginalstorleken och svart runt om förutom det som jag har markerat (y,x,w,h) det är så som jag vill ha det. Fast jag vill ju klippa ut enbart den bilden så det svarta försvinner.
Sedan så sparas inte bilden, om jag går in på någonm annan sida och skriver in sökvägen så är den bilden som jag laddade upp först kvar.

Så hjälp mig.
Hur gör jag för att klippa ut en bild med hjälp av y,x,w,h och sedan spara den?

Medlem sedan dec. 20014 239 inlägg
#5

Så här har jag löst en Crop funtion tidigare. Eller ja hittat på annat ställe
Den borde du kunna använda.

private Image Crop(Image imgPhoto, int Width, int Height)
        {
            
            
            int sourceWidth = imgPhoto.Width;
            int sourceHeight = imgPhoto.Height;
            int sourceX = 0;
            int sourceY = 0;
            int destX = 0;
            int destY = 0;

            float nPercent = 0;
            float nPercentW = 0;
            float nPercentH = 0;

            nPercentW = ((float)Width / (float)sourceWidth);
            nPercentH = ((float)Height / (float)sourceHeight);

            if (nPercentH < nPercentW)
            {
                nPercent = nPercentW;
                destY = 0;
              
            }
            else
            {
                nPercent = nPercentH;
                destX = (int)((Width - (sourceWidth * nPercent)) / 2);
              
            }

            int destWidth = (int)(sourceWidth * nPercent);
            int destHeight = (int)(sourceHeight * nPercent);

            Bitmap bmPhoto = new Bitmap(Width, Height, PixelFormat.Format24bppRgb);
            bmPhoto.SetResolution(imgPhoto.HorizontalResolution, imgPhoto.VerticalResolution);

            Graphics grPhoto = Graphics.FromImage(bmPhoto);
            grPhoto.InterpolationMode = InterpolationMode.HighQualityBicubic;

            grPhoto.DrawImage(imgPhoto,
                new Rectangle(destX, destY, destWidth, destHeight),
                new Rectangle(sourceX, sourceY, sourceWidth, sourceHeight),
                GraphicsUnit.Pixel);

            grPhoto.Dispose();
            return bmPhoto;
        }
Medlem sedan dec. 2005198 inlägg
#6

Du hittade möjligtvis inte koden här?:
http://www.codeproject.com/csharp/imageresize.asp

Jag har försökt med den koden, men jag får detta felmeddelande:
System.Runtime.InteropServices.ExternalException: A generic error occurred in GDI+

Jag sparar den på detta settet:
b.Save("Upload/1/", System.Drawing.Imaging.ImageFormat.Jpeg);

Då jag har ett webhotell så kan jag nog inte köra med virtuell mappväg väll? Vad gör jag för fel?

EDIT, nu har jag lyckats lösa så det svarta försvinner. Men hur gör jag för att spara bilden?

Medlem sedan dec. 20014 239 inlägg
#7

Border det inte vara:

b.Save("Upload/1/filnamn.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);

Alternativt:

b.Save(Server.MapPath("\") & "Upload\1\filnamn.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);

Kontrollera även att du har behörighet att spara filen på angivet ställe.

Medlem sedan dec. 2005198 inlägg
#8

Det vill sig ändå inte, måste det vara så svårt bara för att spara en bild?
Jag testade med Server.MapPath("\Upload\1\fil.jpg") men icke.

Hur ska jag lösa det?

Medlem sedan maj 20012 812 inlägg
#9

Det kan vara så enkelt så att den användare som användas när man besöker din websida inte har rättigheter att spara till den mappen som du vill.

- M

Medlem sedan dec. 20014 239 inlägg
#10

Zaiman skrev:

Kontrollera även att du har behörighet att spara filen på angivet ställe.

Citerar mig själv :)

Medlem sedan dec. 2005198 inlägg
#11

jag har också varit inne på den svängen. Men det roliga är att jag får samma felmeddelande när jag debuggar som när jag kör på mitt webbhotell.
Och jag vet att mitt webbhotell har rättigheter på den mappen som jag laddar upp till för det är det den mappen är till för.

Så här ser min kod ut nu:

			int destX = Convert.ToInt32(Request.Form["y1"]);
			int destY = Convert.ToInt32(Request.Form["x1"]);
			int destWidth = Convert.ToInt32(Request.Form["width"]);
			int destHeight = Convert.ToInt32(Request.Form["height"]);

			string strFilename = Server.MapPath("Upload/" + Convert.ToString(Session["intID"]) + "/" + Convert.ToString(Session["intID"]) + ".jpg");

			System.Drawing.Image i = System.Drawing.Image.FromFile(strFilename);
			Bitmap b = new System.Drawing.Bitmap(destWidth, destWidth);
			b.SetResolution(i.HorizontalResolution, i.VerticalResolution);

			Graphics g = Graphics.FromImage(b);
			g.InterpolationMode = InterpolationMode.Low;
			g.DrawImage(i, 0, 0, new Rectangle(destX, destY, destWidth, destHeight), GraphicsUnit.Pixel);
			g.Dispose();

			b.Save(strFilename, System.Drawing.Imaging.ImageFormat.Jpeg);
			b.Dispose();

jag förstår inte vad felet kan va?

Medlem sedan dec. 20014 239 inlägg
#12

Kan du posta hela felmeddelandet? Eller är det allt som står?

Medlem sedan dec. 2005198 inlägg
#13

A generic error occurred in GDI+.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.Runtime.InteropServices.ExternalException: A generic error occurred in GDI+.

Source Error:

Line 92: 			g.Dispose();
Line 93: 
Line 94: 			b.Save(strFilename, System.Drawing.Imaging.ImageFormat.Jpeg);
Line 95: 			b.Dispose();
Line 96: 		}

Source File: C:\Documents and Settings\Micke\Mina dokument\Visual Studio 2005\Projects\LL\LinkopingLife\ImageSettings.aspx.cs Line: 94

Stack Trace:

[ExternalException (0x80004005): A generic error occurred in GDI+.]
System.Drawing.Image.Save(String filename, ImageCodecInfo encoder, EncoderParameters encoderParams) +601
System.Drawing.Image.Save(String filename, ImageFormat format) +51
LinkopingLife._ImageSettings.CropImage_Click(Object sender, EventArgs e) in C:\Documents and Settings\Micke\Mina dokument\Visual Studio 2005\Projects\LL\LinkopingLife\ImageSettings.aspx.cs:94
System.Web.UI.WebControls.Button.OnClick(EventArgs e) +75
System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +97
System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +7
System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +11
System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +33
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +4926

Hela koden finns här:
http://www.aspsidan.se/code/default.asp?c=7455

Medlem sedan dec. 20014 239 inlägg
#14

Hmm är det inte så att du försöker spara över filen som du redan använder?

Prova att spara som annat namn.

Medlem sedan dec. 2005198 inlägg
#15

Zaiman, helt riktigt!
Märkte det nu när jag höll på att pilla med koden och råkade av rent misstag ändra så jag ändrade namn på filen då fungerade det alldeles utmärkt!

Nu ska jag kolla på koden som du skrev tidigare och se om jag kan få till det bättre, för nu så beskärs inte bilden som jag vill. Tack för hjälpen så länge!

Medlem sedan dec. 20014 239 inlägg
#16

Markera gärna tråden som löst.

260 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
128 ms — deklarationer (db)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)
125 ms — ändringar (db)