webForumDet fria alternativet

Filstorlek på System.Drawing.Image

.NETur .NET

6 svar · 403 visningar · startad av Cale

Medlem sedan mars 200490 inlägg
Frågan#1

jag har uppgraderat min bilduppladdning med lite variabel storleksändring och såg då nånting som jag missat tidigare..
när jag laddar upp bilden kollas filstorleken mot filen man laddar upp, men det jag gör är att förminska den. men det var fortfarande den ursprungliga storleken som hamnade i databasen, inte bra.

det verkar inte gå att kolla filstorlek direkt på ett image-objekt (eller hur?).
måste jag leta upp den förminskade filen på servern och räkna ut det därifrån?

Medlem sedan maj 20012 812 inlägg
#2

Du borde kunna omvandla ditt image objekt till en byte[] och ta längden på den array och då få fram antal bytes som din image består av.

MemoryStream memoryStream = new MemoryStream();
myImageObject.Save(memoryStream, SOME_IMAGE_FORMAT)
byte[] buffer = memoryStream.ToArray();

- M

Medlem sedan mars 200490 inlägg
#3

jag förstår inte riktigt vad det är du gör där?
deklarera memoryStream, spara myImageObject med sökvägen memoryStream?

det sista jag gör innan jag vill kolla storleken är:

fullSizeImg.Save(imageFullPathLocation & DB_Url, ImageFormat.Gif)

där fullSizeImg är en Image.

hur konverterar jag Image till en MemoryStream?

edit:

såhär kanske :P

fullSizeImg.Save(memStream, ImageFormat.Jpeg)

hur får jag sedan in det i array'en?

Medlem sedan maj 20012 812 inlägg
#4

Okej jag skriver om det med dina objekt

MemoryStream memStream= new MemoryStream();
fullSizeImg.Save(memStream, ImageFormat.Gif)
byte[] buffer = memStream.ToArray();
int size = buffer.Length;

copy-pasta koden till din kod innan/efter du sparat bilden till disken...

- M

Medlem sedan mars 200490 inlägg
#5

det verkar vara nåt annat som stör vid konverteringen av bilden (?)

kan ju bifoga lite mer så kanske det går att se bättre, testade en fungerande kodsnutt men inblandad i min kod så visar det tokfel storlek.

		'#Lägg till hela sökvägen till filen
		Dim imageFullPathFile As String = Server.MapPath(loc & DB_Url)
		Dim imageFullPathLocation As String = Server.MapPath(loc)

		dim fullSizeImg As System.Drawing.Image

		'#Öppna bilden. Kan egentligen behövas try-catch här
		fullSizeImg = System.Drawing.Image.FromFile(imageFullPathFile)

		'Förminska Bilden och skapa tummnaglar
		Dim newImg As New Bitmap(fullSizeImg)
		fullSizeImg.Dispose()
		fullSizeImg = newImg
		
		Dim decDiff As Decimal
		Dim intMaxWidth As Integer = 640
		Dim intMaxHeight As Integer = 480

		'Bilden
		'är bilden för stor? i så fall minskar vi storleken
		If fullSizeImg.Width >= intMaxWidth Or fullSizeImg.Height >= intMaxHeight Then 'behöver bilden förminskas?
			If fullSizeImg.Width > fullSizeImg.Height Then '4:3 "bred"
				'thumbNailImg = fullSizeImg.GetThumbnailImage(100, 75, Nothing, IntPtr.Zero)
				decDiff = fullSizeImg.Width / intMaxWidth
				Dim NewHeight As Integer = fullSizeImg.Height / decDiff
				fullSizeImg = fullSizeImg.GetThumbnailImage(intMaxWidth, NewHeight, Nothing, IntPtr.Zero)
			Else '3:4 "hög"
				'thumbNailImg = fullSizeImg.GetThumbnailImage(75, 100, Nothing, IntPtr.Zero)
				decDiff = fullSizeImg.Height / intMaxHeight
				Dim NewWidth As Integer = fullSizeImg.Width / decDiff
				fullSizeImg = fullSizeImg.GetThumbnailImage(NewWidth, intMaxHeight, Nothing, IntPtr.Zero)
			End If

			'sparar bilden
			Dim TheImageType As String = FindImageType(imgContentType) 'klippa ner "image/filtyp" till bara "filtyp"
			If TheImageType = "jpeg" Then
				fullSizeImg.Save(imageFullPathLocation & DB_Url, ImageFormat.Jpeg)
				lblMessage.Text = lblMessage.Text & "jpeg-bilden var för stor och har nu förminskats" & "<br>"
			Else If TheImageType = "gif" Then
				fullSizeImg.Save(imageFullPathLocation & DB_Url, ImageFormat.Gif)
				lblMessage.Text = lblMessage.Text & "gif-bilden var för stor och har nu förminskats" & "<br>"
			End If
		End If
		
		'blaj, experimenterar lite här
		Dim memStream As New MemoryStream()
		fullSizeImg.Save(memStream, ImageFormat.Jpeg)
		'Dim arrImage() As Byte = memStream.GetBuffer
		'memStream.Close()
		'response.write(arrImage.Length)
		'Dim Thecount As Integer = 0
		'While(Thecount < arrImage.Length)
		'	memStream.WriteByte(arrImage(Thecount))
		'	Thecount += 1
		'End While
		'response.write("<br>")
		'response.write(arrImage(Thecount - 1).tostring)
		'response.write("<br>")
		'response.write(memStream.Length)
		Dim buff As Byte() = memStream.ToArray() 
		response.write("<br>")
                response.write(memStream.Length.ToString)
Medlem sedan mars 200490 inlägg
#6

kan det vara att den görs om till bitmap för att kunna förminskas som storleken int stämmer?

Medlem sedan maj 20012 812 inlägg
#7

Borde inte vara det eftersom du säger att det imagetypen jpeg som du vill spara ner bilden som när du spara den till arrayn.

Jag vet faktiskt inte eftersom jag aldrig testat metoden, bara något som jag hittat när jag kollat runt lite...

- M

138 ms totalt · 3 externa anrop · v20260731065814-full.b746b907
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
135 ms — hämta tråd, inlägg och bilagor (db)