Ich mache das ja schon lange.... und ich habe auch schon einiges mit Bildern zu tun gehabt.
Aber jedes mal wieder fummele ich mir aus alten Codes oder dem Internet die Funktionen für Größenveränderungen heraus.
Meist sind diese (vor allem bei gegoogelten Beispielen) gespickt mit Spezialfunktionalität.
Diesemal habe ich mir die Mühe gemacht - ein für alle Mal - drei Funktionen zu generieren, die sowohl Cropping, Resizing oder aber beides gleichzeitig in bestmöglicher Qualität zu liefern.
Und da ich meißt nur ein Stream oder Byte() benötige, bekomme ich as Rückgabewert auch ein MemoryStream.
Diesen kann ich in die Datenbank schieben oder per BinaryWrite direkt ausgeben.
1 Imports System
2 Imports System.Drawing
3 Imports System.Drawing.Imaging
4 Imports System.IO
5 Imports System.Drawing.Drawing2D
6
7 Partial Class _default3
8 Inherits System.Web.UI.Page
9
10
11 Protected Sub Page_Load(ByVal sender As Object, _
12 ByVal e As System.EventArgs) Handles Me.Load
13
14 Dim X1 As Integer = 30 'Ausschnitt-Punkt links
15 Dim Y1 As Integer = 30 'Ausschnitt-Punkt oben
16 Dim X2 As Integer = 120 'Ausschnitt-Punkt rechts
17 Dim Y2 As Integer = 120 'Ausschnitt-Punkt unten
18
19 Dim targetWidth = 150 'Neue Breite für resize
20 Dim targetHeight = 200 'Neue Höhe für resize
21
22 Dim img As Image = Image.FromFile("d:\myPath\test.png")
23
24 Response.ContentType = "image/png"
25 Response.StatusCode = 200
26 Response.BinaryWrite( _
27 imageFunctions.cropAndResizeImage(img, _
28 targetWidth, _
29 targetHeight, _
30 X1, _
31 Y1, _
32 X2, _
33 Y2, _
34 Imaging.ImageFormat.Png).ToArray)
35 Response.End()
36
37 End Sub
38
39
40
41
42 End Class
43
44
45 Class imageFunctions
46 Public Shared Function cropAndResizeImage(ByVal img As Image, _
47 ByVal targetWidth As Integer, _
48 ByVal targetHeight As Integer, _
49 ByVal x1 As Integer, _
50 ByVal y1 As Integer, _
51 ByVal x2 As Integer, _
52 ByVal y2 As Integer, _
53 ByVal imageFormat As Imaging.ImageFormat _
54 ) As MemoryStream
55
56 Dim bmp As New System.Drawing.Bitmap(targetWidth, targetHeight)
57 Dim g As Graphics = Graphics.FromImage(bmp)
58
59 g.InterpolationMode = InterpolationMode.HighQualityBicubic
60 g.SmoothingMode = SmoothingMode.HighQuality
61 g.PixelOffsetMode = PixelOffsetMode.HighQuality
62 g.CompositingQuality = CompositingQuality.HighQuality
63
64 Dim width As Integer = x2 - x1
65 Dim height As Integer = y2 - y1
66
67 g.DrawImage(img, _
68 New Rectangle(0, 0, _
69 CInt(targetWidth), _
70 CInt(targetHeight) _
71 ), _
72 x1, y1, width, height, _
73 GraphicsUnit.Pixel)
74
75 Dim memStream As New MemoryStream
76
77 bmp.Save(memStream, ImageFormat)
78 Return memStream
79
80 End Function
81
82
83 'Daraus ergeben sich die folgenden Methoden resize und crop:
84 Public Shared Function resizeImage(ByVal img As Image, _
85 ByVal targetWidth As Integer, _
86 ByVal targetHeight As Integer, _
87 ByVal imageFormat As Imaging.ImageFormat _
88 ) As MemoryStream
89
90 Return cropAndResizeImage(img, _
91 targetWidth, _
92 targetHeight, _
93 0, _
94 0, _
95 img.Width, _
96 img.Height, _
97 imageFormat)
98 End Function
99
100 Public Shared Function cropImage(ByVal img As Image, _
101 ByVal x1 As Integer, _
102 ByVal y1 As Integer, _
103 ByVal x2 As Integer, _
104 ByVal y2 As Integer, _
105 ByVal imageFormat As Imaging.ImageFormat _
106 ) As MemoryStream
107
108 Return cropAndResizeImage(img, _
109 x2 - x1, _
110 y2 - y1, _
111 x1, _
112 y1, _
113 x2, _
114 y2, _
115 imageFormat)
116 End Function
117 End Class