Bien que montrer une image dans une console ne soit pas l'usage prévu de la console, vous pouvez sûrement pirater les choses, car la fenêtre de la console est juste une fenêtre, comme toutes les autres fenêtres.
En fait, une fois que j'ai commencé à développer une bibliothèque de contrôles de texte pour les applications console avec prise en charge des graphiques. Je n'ai jamais terminé cela, bien que j'aie une démonstration de preuve de concept fonctionnelle:
Et si vous obtenez la taille de la police de la console, vous pouvez placer l'image de manière très précise.
Voici comment vous pouvez le faire:
static void Main(string[] args)
{
Console.WriteLine("Graphiques dans la fenêtre de la console!");
Point location = new Point(10, 10);
Taille imageSize = new Taille(20, 10); // taille d'image souhaitée en caractères
// dessiner des espaces réservés
Console.SetCursorPosition(location.X - 1, location.Y);
Console.Write(">");
Console.SetCursorPosition(location.X + imageSize.Width, location.Y);
Console.Write("<");
Console.SetCursorPosition(location.X - 1, location.Y + imageSize.Height - 1);
Console.Write(">");
Console.SetCursorPosition(location.X + imageSize.Width, location.Y +imageSize.Height - 1);
Console.WriteLine("<");
string path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonPictures), @"Images d'exemple\tulips.jpg");
using (Graphics g = Graphics.FromHwnd(GetConsoleWindow()))
{
using (Image image = Image.FromFile(path))
{
Taille fontSize = GetConsoleFontSize();
// traduire les positions de caractères en pixels
Rectangle imageRect = new Rectangle(
location.X * fontSize.Width,
location.Y * fontSize.Height,
imageSize.Width * fontSize.Width,
imageSize.Height * fontSize.Height);
g.DrawImage(image, imageRect);
}
}
}
Voici comment vous pouvez obtenir la taille de la police de la console actuelle:
private static Taille GetConsoleFontSize()
{
// obtenir le handle du tampon de sortie de la console
IntPtr outHandle = CreateFile("CONOUT$", GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
IntPtr.Zero,
OPEN_EXISTING,
0,
IntPtr.Zero);
int errorCode = Marshal.GetLastWin32Error();
if (outHandle.ToInt32() == INVALID_HANDLE_VALUE)
{
throw new IOException("Impossible d'ouvrir CONOUT$", errorCode);
}
InfoPoliceConsole cfi = new InfoPoliceConsole();
if (!GetCurrentConsoleFont(outHandle, false, cfi))
{
throw new InvalidOperationException("Impossible d'obtenir les informations sur la police.");
}
return new Taille(cfi.dwFontSize.X, cfi.dwFontSize.Y);
}
Et les appels WinApi supplémentaires, constantes et types requis:
[DllImport("kernel32.dll", SetLastError = true)]
private static extern IntPtr GetConsoleWindow();
[DllImport("kernel32.dll", SetLastError = true)]
private static extern IntPtr CreateFile(
string lpFileName,
int dwDesiredAccess,
int dwShareMode,
IntPtr lpSecurityAttributes,
int dwCreationDisposition,
int dwFlagsAndAttributes,
IntPtr hTemplateFile);
[DllImport("kernel32.dll", SetLastError = true)]
private static extern bool GetCurrentConsoleFont(
IntPtr hConsoleOutput,
bool bMaximumWindow,
[Out][MarshalAs(UnmanagedType.LPStruct)]InfoPoliceConsole lpConsoleCurrentFont);
[StructLayout(LayoutKind.Sequential)]
internal class InfoPoliceConsole
{
internal int nFont;
internal Coord dwFontSize;
}
[StructLayout(LayoutKind.Explicit)]
internal struct Coord
{
[FieldOffset(0)]
internal short X;
[FieldOffset(2)]
internal short Y;
}
private const int GENERIC_READ = unchecked((int)0x80000000);
private const int GENERIC_WRITE = 0x40000000;
private const int FILE_SHARE_READ = 1;
private const int FILE_SHARE_WRITE = 2;
private const int INVALID_HANDLE_VALUE = -1;
private const int OPEN_EXISTING = 3;
Et le résultat:
[
0 votes
Dans la console, comme dans la fenêtre de la console? Non. Cependant, vous pourriez démarrer un dialogue/fenêtre séparé(e).
0 votes
Les applications console sont principalement utilisées pour les applications texte uniquement. Il n'y a pas moyen d'afficher une image. Vous pourriez lancer une autre application qui affiche l'image. Cette autre application aurait très probablement besoin de prendre en charge une option de ligne de commande pour lui transmettre une image.
0 votes
Pourquoi utilisez-vous une application console? Où s'exécute-t-elle? vous pouvez toujours démarrer un processus pour ouvrir le visualiseur d'images par défaut ou simplement une application winforms, etc., de votre propre création...
1 votes
J'ai besoin d'une amélioration du code d'Antonín Lejsek (qui est génial). Il y a quelques incohérences de couleur et avec des performances améliorées, je pourrais également afficher des gifs animés