Was ist der beste Weg, ein Bild in .NET zu „square“?
-
03-07-2019 - |
Frage
ich generieren müssen Thumbnails für eine Reihe von JPEG-Dateien (200.000), aber ich möchte, dass eine gleiche Höhe und Breite alle meine Daumen machen. Allerdings mag ich nicht die Proportionen des Bildes ändern, damit ich leeren Raum zur kürzeren Dimension hinzufügen muß, um „es Platz bis“. Die Hintergrundfarbe des leeren Raumes ist variabel.
Hier ist der Code-Schnipsel ich die Daumen erzeugen bin mit. Was ist der beste Weg, um die Quadratur zu tun?
Dim imgDest As System.Drawing.Bitmap = New Bitmap(ScaleWidth, ScaleHeight)
imgDest.SetResolution(TARGET_RESOLUTION, TARGET_RESOLUTION)
Dim grDest As Graphics = Graphics.FromImage(imgDest)
grDest.DrawImage(SourceImage, 0, 0, imgDest.Width, imgDest.Height)
Lösung
Wie wäre es diese. Vielleicht sollten Sie ein schwarze ziehen (oder je nachdem, welche Farbe) Rechteck auf dem Bitmap zuerst.
Und dann, wenn Sie die Größe geänderte Bild platzieren, berechnet nur die Platzierung des Bildes basierend auf Unabhängig davon, welche Dimension kürzer ist, und dann diese Dimension bewegen, indem die Hälfte der Differenz (und die übrigen auf 0).
Wäre das nicht, dass die Arbeit?
Andere Tipps
Wie Vaibhav , sagten, zuerst den gesamten Miniaturansichtsbereich mit schwarzem Lack. Dies wird einfacher sein als das Bild zuerst in die Miniatur Einpassen und dann bestimmen, welche Pillarboxing
Pseudo-Code für eine allgemeine Lösung, die ein imageWidth
x imageHeight
Bild in ein thumbWidth
x thumbHeight
passen (muss nicht ein Quadrat) Bereich:
imageRatio = imageWidth / imageHeight;
thumbRatio = thumbWidth / thumbHeight;
zoomFactor = imageRatio >= thumbRatio
? thumbWidth / imageWidth
: thumbHeight / imageHeight;
destWidth = imageWidth * zoomFactor;
destHeight = imageHeight * zoomFactor;
drawImage(
(thumbWidth - destWidth) >> 1,
(thumbHeight - destHeight) >> 1,
destWidth,
destHeight);