Ok, ich habe es gelöst (ob das nun "der" Weg nach Rom ist, sei mal dahingestellt). Nachfolgend ein komplettes, ausführbares Beispiel (als ASP.NET MVC-Controller).
public class ImageController : Controller
{
public ActionResult Test()
{
var text = DateTime.Now.ToString();
var font = new Font("Arial", 20, FontStyle.Regular);
var angle = 233;
SizeF textSize = GetEvenTextImageSize(text, font);
SizeF imageSize;
if (angle == 0)
imageSize = textSize;
else
imageSize = GetRotatedTextImageSize(textSize, angle);
using (var canvas = new Bitmap((int)imageSize.Width, (int)imageSize.Height))
{
using(var graphics = Graphics.FromImage(canvas))
{
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
graphics.SmoothingMode = SmoothingMode.HighQuality;
graphics.TextRenderingHint = TextRenderingHint.SingleBitPerPixelGridFit;
SizeF textContainerSize = graphics.VisibleClipBounds.Size;
graphics.TranslateTransform(textContainerSize.Width / 2, textContainerSize.Height / 2);
graphics.RotateTransform(angle);
graphics.DrawString(text, font, Brushes.Black, -(textSize.Width / 2), -(textSize.Height / 2));
}
var stream = new MemoryStream();
canvas.Save(stream, ImageFormat.Png);
stream.Seek(0, SeekOrigin.Begin);
return new FileStreamResult(stream, "image/png");
}
}
private static SizeF GetEvenTextImageSize(string text, Font font)
{
using (var image = new Bitmap(1, 1, PixelFormat.Format32bppArgb))
{
using (Graphics graphics = Graphics.FromImage(image))
{
return graphics.MeasureString(text, font);
}
}
}
private static SizeF GetRotatedTextImageSize(SizeF fontSize, int angle)
{
// Source: http://www.codeproject.com/KB/graphics/rotateimage.aspx
double theta = angle * Math.PI / 180.0;
while (theta < 0.0)
theta += 2 * Math.PI;
double adjacentTop, oppositeTop;
double adjacentBottom, oppositeBottom;
if ((theta >= 0.0 && theta < Math.PI / 2.0) || (theta >= Math.PI && theta < (Math.PI + (Math.PI / 2.0))))
{
adjacentTop = Math.Abs(Math.Cos(theta)) * fontSize.Width;
oppositeTop = Math.Abs(Math.Sin(theta)) * fontSize.Width;
adjacentBottom = Math.Abs(Math.Cos(theta)) * fontSize.Height;
oppositeBottom = Math.Abs(Math.Sin(theta)) * fontSize.Height;
}
else
{
adjacentTop = Math.Abs(Math.Sin(theta)) * fontSize.Height;
oppositeTop = Math.Abs(Math.Cos(theta)) * fontSize.Height;
adjacentBottom = Math.Abs(Math.Sin(theta)) * fontSize.Width;
oppositeBottom = Math.Abs(Math.Cos(theta)) * fontSize.Width;
}
int nWidth = (int)Math.Ceiling(adjacentTop + oppositeBottom);
int nHeight = (int)Math.Ceiling(adjacentBottom + oppositeTop);
return new SizeF(nWidth, nHeight);
}
}
Hallo herbivore,
mein Problem ist allerdings tatsächlich herauszufinden, wie groß das Rechteck ist, in dem sich der Text befindet, nachdem er gedreht wurde. Siehe Anhang - ich benötige die Größe für B, nicht für A (A bekomme ich ja z.B. auf deinem Weg).
Erklär am besten nochmal wo du welche Probleme hast.
Vorgehensweise jetzt:1.Ich messe die Größe des Strings aus. 1.Ich erstelle mit der Größe ein Bitmap. 1.Ich zeichne den Text auf das Bitmap. 1.Wenn der Text rotiert werden soll, rotiere ich das gesamte bereits erzeugte Bitmap.
Das Problem: die Qualität des Textes ist schlecht, da ich zur Verwendung von InterpolationMode.NearestNeighbor gezwungen bin, da ich kein Antialiasing zulassen darf.
Daher der Gedanke das Ganze umzustellen und den Text gleich gedreht zu zeichnen. Das Problem: ich muss vorher bereits die Größe des finalen Bitmaps bekommen, auf das dann gezeichnet wird.
Hallo zusammen,
ich erstelle Grafiken, die lediglich Text enthalten. Die Größe der Grafiken bestimmt sich dabei aus dem Text. Momentan lese ich also mittels Graphics.MeasureString() die Größe aus, erstelle das Bitmap und zeichne dann mittels Graphics.DrawString() den Text darauf. Soll der Text rotiert werden, nehme ich das fertige Bitmap und drehe es.
Das wäre an sich zwar sicher nicht der performanteste, aber doch ein gangbarer Weg. Mein Problem ist allerdings, dass ich eine begrenzte Farbpalette zur Verfügung habe und somit jegliches Antialiasing (was neue Farben erzeugt) vermeiden muss.
Deshalb verwende ich beim Rotieren InterpolationMode.NearestNeighbor. Das funktioniert zwar, erzeugt aber ein ziemlich bescheidenes Ergebnis. Daher mein Gedanke: sollte es nicht möglich sein den Text normal zu zeichnen und mittels Graphics.RotateTransform() zu drehen?
(Der Unterschied ist zwar gering aber doch deutlich sichtbar, ich habe Beides schon verglichen.)
Ich bekomme es momentan nicht hin ohne mit dem Text irgendwo über die Grenzen des Rechtecks zu laufen, d.h. Text abzuschneiden (ich muss die finale Größe des Bitmaps ja kennen und festlegen, bevor ich den Text zeichnen kann).
Hat jemand eine Idee, wie das zu lösen wäre?
Original von VizOne
Womöglich ist das Thema aber grenzwertig zwischen beiden anzusiedeln (Web-Probleme auf technischer Ebene sind nicht selten im Netzwerkbereich anzusiedeln). Welches Forum muss er nehmen?
Jetzt drehen wir uns im Kreis. Die passende Definition wurde weiter oben nicht nur von mir bereits vorgeschlagen. Dass du immer ein paar Merkbefreite hast, lässt sich nicht verhindern. Erst gestern hat bei mir in dotnetjob.de wieder einer eine Stelle für einen Fahrradmonteur ausschreiben wollen. Was soll's ...
Original von VizOne
Ich möchte euch also anders fragen: seht ihr eine (begründete) Notwendigkeit, das Web- und Netzwerkforum aufzuteilen, welche die genannten Probleme wieder wettmacht?
Sonst würde die Diskussion hier sicher nicht schon zum zweiten Mal geführt werden.
Original von herbivore
Würde denn ein
> oder eine autokatische Gruppe überhaupt ein Forum "Wünsche und Kritik" einrichten?
Hatte die DDR ein Parlament?
Original von herbivore
Und würden in einem autokratischen Forum so viele Wünsche der Benutzer so schnell und unbürokratisch umgesetzt werden, wie hier? Wohl kaum!
Die Wahrheit ist nicht schwarz/weiß, und sie zeigt sich insbesondere dann, wenn Sachen gewünscht und gefordert werden, die von der Administration nicht nachvollzogen/unterstützt/verstanden/gebilligt werden.
Kaum kommen die konstruktiven Vorschläge, wird es hier ganz still ... ich sag nur: typische Foren-Autokratie 👍
Original von LordHexa
Hallo zusammen,gibt es eine einfache Möglichkeit zu bestimmen, welcher Browser vom Client verwendet wird?
Greetz,
LordHexa
Request.Browser
Original von Golo
Original von joerguth
ASP.Net gehört eher in den Bereich UIQuatsch. Wenn ich einen Web Service schreibe, ist das auch ASP.NET ... was hat das mit UI zu tun? HTML und CSS haben mit UI zu tun, aber ASP.NET nur wenig.
Das ist übrigens deine eigene, meiner Meinung nach falsche Interpretation. Was haben Webservices mit ASP.NET zu tun? Ist eine CF- oder Winforms-Anwendung die über WebServices Daten austauscht dann auch automatisch ASP.NET? Das sind zwei getrennte paar Schuhe, die nichts gemeinsam haben, bis auf die Tatsache, dass sie irgendwo mal HTTP passieren.
Original von Golo
Original von Waschbecken
Zum Thema: schaut euch unter
>> an, wie man eine Aufteilung zum Thema ASP.NET sinnvoll gestalten kann -
>> zusammengefasst würde ein sinnvolles Themengebiet zu ASP.NET ergeben.Glengamoi verzichtet dafür auf ein Forum, wo zum Beispiel Netzwerktechnologien wie klassische Stackprogrammierung eindeutig reingehört ... genau DAS ist ja das Problem, dass sich das eben von Webtechnologien nicht strikt trennen lässt. Wenn Du dafür einen konstruktiven und sinnvollen Vorschlag hast, könnte ich mir gut vorstellen, dass das auf offene Ohren stößt.
Machts euch doch nicht so schwer: ASP.NET ist alles was im weitesten Sinne mit HTML, CSS, JavaScript, WebControls, UserControls, Masterpages, Sessions usw. zu tun hat, was sich also im Namespace System.Web versteckt.
Alles, wo irgendwas auf irgendeine Art (Remoting, Webservices) übers Netz geschickt wird, kommt in das Netzwerktechnikwieauchimmerforum. Denn auch wenn ein HttpWebRequest häufig mit ASP.NET zum Einsatz kommt, kann man schon sagen, dass das nicht das einzige Einsatzgebiet ist.
Und wenn sich die Themen überschneiden, bleibts halt in dem Forum stehen, wo es gepostet wird, oder wird je nach Gusto des Moderators verschoben. Wo das Topic letztendlich steht ist sowieso zweitrangig, da bei der Masse an Themen niemand über die Forenansicht navigiert um was zu suchen, sondern gleich die Suche benutzt - und die interessiert es herzlich wenig, wo etwas drin steht, zumindest nicht in der Standard-Variante die geschätzte 99% aller Leute nutzen.
Also nochmal in einem Satz: Alles, wo irgendwas übers Netz(werk) geschickt wird, kommt in ein Forum, alles was irgendwas produziert, was im Browser landet, in das ASP.NET-Forum.
Ich sehe da eine kleine Lücke zw. Anspruch und Wirklichkeit. Jemanden zu finden, der exakt ins Profil passt und auch noch bezahlbar ist, wird heute immer schwerer.
Wichtig ist, dass derjenige, auf den die Wahl fällt, entsprechende Vorkenntnisse hat und nicht ganz auf der grünen Wiese anfängt, und dass er bereit ist, sich in neue Themen einzuarbeiten.
Wenn es nicht alle paar Tage neue Probleme zu lösen hätte, vor denen ich vorher nie gestanden habe, würde mir der Job nicht so viel Spaß machen. Und niemand hat das Wissen mit dem Löffel gefressen.
Ergo: etwas Einarbeitungszeit sollte zur Verfügung gestellt werden, denn der perfekte Mitarbeiter fällt selten vom Himmel.