Pertanyaan Menampilkan Gambar di aplikasi konsol


Saya memiliki aplikasi konsol yang mengelola gambar. Sekarang saya membutuhkan sesuatu seperti preview Gambar dalam aplikasi konsol. Apakah ada cara untuk menampilkannya di konsol?

Berikut ini adalah perbandingan dari jawaban berbasis karakter saat ini:

Memasukkan:

enter image description here

Keluaran:

enter image description here

enter image description here

enter image description here

enter image description here


75
2017-11-05 07:08


asal


Jawaban:


Saya selanjutnya bermain dengan kode dari @DieterMeemken. Saya membagi dua resolusi vertikal dan menambahkan dithering melalui ░▒▓. Di sebelah kiri adalah hasil Dieter Meemken, di sebelah kanan saya. Di bagian bawah gambar asli diubah ukurannya agar sesuai dengan output. Output result Sementara fungsi konversi Malwyns mengesankan, itu tidak menggunakan semua warna abu-abu, apa yang disayangkan.

static int[] cColors = { 0x000000, 0x000080, 0x008000, 0x008080, 0x800000, 0x800080, 0x808000, 0xC0C0C0, 0x808080, 0x0000FF, 0x00FF00, 0x00FFFF, 0xFF0000, 0xFF00FF, 0xFFFF00, 0xFFFFFF };

public static void ConsoleWritePixel(Color cValue)
{
    Color[] cTable = cColors.Select(x => Color.FromArgb(x)).ToArray();
    char[] rList = new char[] { (char)9617, (char)9618, (char)9619, (char)9608 }; // 1/4, 2/4, 3/4, 4/4
    int[] bestHit = new int[] { 0, 0, 4, int.MaxValue }; //ForeColor, BackColor, Symbol, Score

    for (int rChar = rList.Length; rChar > 0; rChar--)
    {
        for (int cFore = 0; cFore < cTable.Length; cFore++)
        {
            for (int cBack = 0; cBack < cTable.Length; cBack++)
            {
                int R = (cTable[cFore].R * rChar + cTable[cBack].R * (rList.Length - rChar)) / rList.Length;
                int G = (cTable[cFore].G * rChar + cTable[cBack].G * (rList.Length - rChar)) / rList.Length;
                int B = (cTable[cFore].B * rChar + cTable[cBack].B * (rList.Length - rChar)) / rList.Length;
                int iScore = (cValue.R - R) * (cValue.R - R) + (cValue.G - G) * (cValue.G - G) + (cValue.B - B) * (cValue.B - B);
                if (!(rChar > 1 && rChar < 4 && iScore > 50000)) // rule out too weird combinations
                {
                    if (iScore < bestHit[3])
                    {
                        bestHit[3] = iScore; //Score
                        bestHit[0] = cFore;  //ForeColor
                        bestHit[1] = cBack;  //BackColor
                        bestHit[2] = rChar;  //Symbol
                    }
                }
            }
        }
    }
    Console.ForegroundColor = (ConsoleColor)bestHit[0];
    Console.BackgroundColor = (ConsoleColor)bestHit[1];
    Console.Write(rList[bestHit[2] - 1]);
}


public static void ConsoleWriteImage(Bitmap source)
{
    int sMax = 39;
    decimal percent = Math.Min(decimal.Divide(sMax, source.Width), decimal.Divide(sMax, source.Height));
    Size dSize = new Size((int)(source.Width * percent), (int)(source.Height * percent));   
    Bitmap bmpMax = new Bitmap(source, dSize.Width * 2, dSize.Height);
    for (int i = 0; i < dSize.Height; i++)
    {
        for (int j = 0; j < dSize.Width; j++)
        {
            ConsoleWritePixel(bmpMax.GetPixel(j * 2, i));
            ConsoleWritePixel(bmpMax.GetPixel(j * 2 + 1, i));
        }
        System.Console.WriteLine();
    }
    Console.ResetColor();
}

pemakaian:

Bitmap bmpSrc = new Bitmap(@"HuwnC.gif", true);    
ConsoleWriteImage(bmpSrc);

EDIT

Jarak warna adalah topik yang kompleks (sini, sini dan tautan di halaman itu ...). Saya mencoba menghitung jarak di YUV dan hasilnya agak lebih buruk daripada di RGB. Mereka bisa lebih baik dengan Lab dan DeltaE, tetapi saya tidak mencobanya. Jarak dalam RGB tampaknya cukup baik. Bahkan hasilnya sangat mirip baik untuk jarak euclidean dan manhattan dalam ruang warna RGB, jadi saya menduga ada terlalu sedikit warna untuk dipilih.

Sisanya hanyalah gaya kasar dibandingkan warna terhadap semua kombinasi warna dan pola (= simbol). Saya menyatakan rasio fill untuk ░▒▓█ menjadi 1/4, 2/4, 3/4 dan 4/4. Dalam hal ini, simbol ketiga sebenarnya berlebihan untuk yang pertama. Tetapi jika rasio tidak seragam (bergantung pada font), hasilnya bisa berubah, jadi saya meninggalkannya di sana untuk perbaikan di masa mendatang. Warna rata-rata simbol dihitung sebagai rata-rata tertimbang dari foregroudColor dan backgroundColor sesuai dengan rasio pengisian. Ini mengasumsikan warna linear, apa juga penyederhanaan besar. Jadi masih ada ruang untuk perbaikan.


49
2017-11-15 00:44



Meskipun menampilkan gambar di konsol bukan tujuan penggunaan konsol, Anda pasti dapat meretasnya, karena jendela konsol hanya berupa jendela, seperti jendela lainnya.

Sebenarnya, setelah saya mulai mengembangkan perpustakaan kontrol teks untuk aplikasi konsol dengan dukungan grafis. Saya belum pernah menyelesaikannya, meskipun saya memiliki demo proof-of-concept yang berfungsi:

Text controls with image

Dan jika Anda mendapatkan ukuran font konsol, Anda dapat menempatkan gambar dengan sangat tepat.

Ini adalah bagaimana Anda dapat melakukannya:

static void Main(string[] args)
{
    Console.WriteLine("Graphics in console window!");

    Point location = new Point(10, 10);
    Size imageSize = new Size(20, 10); // desired image size in characters

    // draw some placeholders
    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), @"Sample Pictures\tulips.jpg");
    using (Graphics g = Graphics.FromHwnd(GetConsoleWindow()))
    {
        using (Image image = Image.FromFile(path))
        {
            Size fontSize = GetConsoleFontSize();

            // translating the character positions to 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);
        }
    }
}

Di sini adalah bagaimana Anda dapat memperoleh ukuran font konsol saat ini:

private static Size GetConsoleFontSize()
{
    // getting the console out buffer handle
    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("Unable to open CONOUT$", errorCode);
    }

    ConsoleFontInfo cfi = new ConsoleFontInfo();
    if (!GetCurrentConsoleFont(outHandle, false, cfi))
    {
        throw new InvalidOperationException("Unable to get font information.");
    }

    return new Size(cfi.dwFontSize.X, cfi.dwFontSize.Y);            
}

Dan diperlukan tambahan panggilan, konstanta, dan jenis WinApi:

[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)]ConsoleFontInfo lpConsoleCurrentFont);

[StructLayout(LayoutKind.Sequential)]
internal class ConsoleFontInfo
{
    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;

Dan hasilnya:

[Graphics in Console


79
2017-11-11 14:22



Jika Anda menggunakan ASCII 219 (█) dua kali, Anda memiliki sesuatu seperti piksel (██). Sekarang Anda dibatasi oleh jumlah piksel dan jumlah warna di aplikasi konsol Anda.

  • jika Anda mempertahankan pengaturan default, Anda memiliki sekitar 39x39 piksel, jika Anda ingin lebih banyak, Anda dapat mengubah ukuran konsol Anda Console.WindowHeight = resSize.Height + 1;dan Console.WindowWidth = resultSize.Width * 2;

  • Anda harus menjaga aspek rasio gambar sejauh mungkin, sehingga Anda tidak akan memiliki 39x39 dalam banyak kasus

  • Malwyn memasang metode yang diremehkan sepenuhnya untuk berkonversi System.Drawing.Color untuk System.ConsoleColor

jadi pendekatan saya akan

using System.Drawing;

public static void ConsoleWriteImage(Bitmap bmpSrc)
{
    int sMax = 39;
    decimal percent = Math.Min(decimal.Divide(sMax, bmpSrc.Width), decimal.Divide(sMax, bmpSrc.Height));
    Size resSize = new Size((int)(bmpSrc.Width * percent), (int)(bmpSrc.Height * percent));
    Func<System.Drawing.Color, int> ToConsoleColor = c =>
    {
        int index = (c.R > 128 | c.G > 128 | c.B > 128) ? 8 : 0; 
        index |= (c.R > 64) ? 4 : 0;
        index |= (c.G > 64) ? 2 : 0;
        index |= (c.B > 64) ? 1 : 0; 
        return index;
    };
    Bitmap bmpMin = new Bitmap(bmpSrc, resSize);
    for (int i = 0; i < resSize.Height; i++)
    {
        for (int j = 0; j < resSize.Width; j++)
        {
            Console.ForegroundColor = (ConsoleColor)ToConsoleColor(bmpMin.GetPixel(j, i));
            Console.Write("██");
        }
        System.Console.WriteLine();
    }
}

jadi kamu bisa

ConsoleWriteImage(new Bitmap(@"C:\image.gif"));

masukan sampel:

enter image description here

output sampel:

enter image description here


53
2017-11-09 07:46



itu tadi menyenangkan. Terima kasih fubo, saya mencoba solusi Anda dan mampu meningkatkan resolusi pratinjau oleh 4 (2x2).

Saya menemukan, bahwa Anda dapat mengatur warna latar belakang untuk setiap char individu. Jadi, daripada menggunakan dua karakter ASCII 219 (█), saya menggunakan ASCII 223 (▀) dua kali dengan Warna latar depan dan latar belakang yang berbeda. Itu membagi Pixel besar (██) dalam 4 subpiksel seperti ini (▀▄).

Dalam contoh ini saya menempatkan kedua gambar di samping satu sama lain, sehingga Anda dapat melihat perbedaannya dengan mudah:

enter image description here

Berikut ini kodenya:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;

namespace ConsoleWithImage
{
  class Program
  {

    public static void ConsoleWriteImage(Bitmap bmpSrc)
    {
        int sMax = 39;
        decimal percent = Math.Min(decimal.Divide(sMax, bmpSrc.Width), decimal.Divide(sMax, bmpSrc.Height));
        Size resSize = new Size((int)(bmpSrc.Width * percent), (int)(bmpSrc.Height * percent));
        Func<System.Drawing.Color, int> ToConsoleColor = c =>
        {
            int index = (c.R > 128 | c.G > 128 | c.B > 128) ? 8 : 0;
            index |= (c.R > 64) ? 4 : 0;
            index |= (c.G > 64) ? 2 : 0;
            index |= (c.B > 64) ? 1 : 0;
            return index;
        };
        Bitmap bmpMin = new Bitmap(bmpSrc, resSize.Width, resSize.Height);
        Bitmap bmpMax = new Bitmap(bmpSrc, resSize.Width * 2, resSize.Height * 2);
        for (int i = 0; i < resSize.Height; i++)
        {
            for (int j = 0; j < resSize.Width; j++)
            {
                Console.ForegroundColor = (ConsoleColor)ToConsoleColor(bmpMin.GetPixel(j, i));
                Console.Write("██");
            }

            Console.BackgroundColor = ConsoleColor.Black;
            Console.Write("    ");

            for (int j = 0; j < resSize.Width; j++)
            {
                Console.ForegroundColor = (ConsoleColor)ToConsoleColor(bmpMax.GetPixel(j * 2, i * 2));
                Console.BackgroundColor = (ConsoleColor)ToConsoleColor(bmpMax.GetPixel(j * 2, i * 2 + 1));
                Console.Write("▀");

                Console.ForegroundColor = (ConsoleColor)ToConsoleColor(bmpMax.GetPixel(j * 2 + 1, i * 2));
                Console.BackgroundColor = (ConsoleColor)ToConsoleColor(bmpMax.GetPixel(j * 2 + 1, i * 2 + 1));
                Console.Write("▀");
            }
            System.Console.WriteLine();
        }
    }

    static void Main(string[] args)
    {
        System.Console.WindowWidth = 170;
        System.Console.WindowHeight = 40;

        Bitmap bmpSrc = new Bitmap(@"image.bmp", true);

        ConsoleWriteImage(bmpSrc);

        System.Console.ReadLine();
    }
  }
}

Untuk menjalankan contoh, bitmap "image.bmp" harus berada di direktori yang sama dengan yang dapat dieksekusi. Saya meningkatkan ukuran konsol, ukuran pratinjau masih 39 dan dapat diubah int sMax = 39;.

Solusinya dari taffer juga sangat keren. Kalian berdua memiliki upvote saya ...


35
2017-11-13 09:06



Saya sedang membaca tentang ruang warna dan LABORATORIUM ruang tampaknya menjadi pilihan yang baik untuk Anda (lihat pertanyaan ini: Menemukan "jarak" antara warna yang akurat dan Algoritma untuk memeriksa kesamaan warna)

Mengutip Wikipedia CIELAB halaman, keuntungan dari ruang warna ini adalah:

Berbeda dengan model warna RGB dan CMYK, warna Lab dirancang untuk mendekati visi manusia. Ini bercita-cita untuk keseragaman persepsi, dan komponen L yang sangat cocok dengan persepsi manusia tentang ringan. Dengan demikian, ini dapat digunakan untuk membuat koreksi keseimbangan warna yang akurat dengan memodifikasi kurva output dalam komponen a dan b.

Untuk mengukur jarak antar warna yang bisa Anda gunakan Delta E jarak.

Dengan ini Anda dapat memperkirakan lebih baik dari Color untuk ConsoleColor:

Pertama, Anda dapat menentukan suatu CieLab kelas untuk mewakili warna dalam ruang ini:

public class CieLab
{
    public double L { get; set; }
    public double A { get; set; }
    public double B { get; set; }

    public static double DeltaE(CieLab l1, CieLab l2)
    {
        return Math.Pow(l1.L - l2.L, 2) + Math.Pow(l1.A - l2.A, 2) + Math.Pow(l1.B - l2.B, 2);
    }

    public static CieLab Combine(CieLab l1, CieLab l2, double amount)
    {
        var l = l1.L * amount + l2.L * (1 - amount);
        var a = l1.A * amount + l2.A * (1 - amount);
        var b = l1.B * amount + l2.B * (1 - amount);

        return new CieLab { L = l, A = a, B = b };
    }
}

Ada dua metode statis, satu untuk mengukur jarak menggunakan Delta E (DeltaE) dan lainnya untuk menggabungkan dua warna yang menentukan berapa banyak dari setiap warna (Combine).

Dan untuk transformasi dari RGB untuk LAB Anda dapat menggunakan metode berikut (dari sini):

public static CieLab RGBtoLab(int red, int green, int blue)
{
    var rLinear = red / 255.0;
    var gLinear = green / 255.0;
    var bLinear = blue / 255.0;

    double r = rLinear > 0.04045 ? Math.Pow((rLinear + 0.055) / (1 + 0.055), 2.2) : (rLinear / 12.92);
    double g = gLinear > 0.04045 ? Math.Pow((gLinear + 0.055) / (1 + 0.055), 2.2) : (gLinear / 12.92);
    double b = bLinear > 0.04045 ? Math.Pow((bLinear + 0.055) / (1 + 0.055), 2.2) : (bLinear / 12.92);

    var x = r * 0.4124 + g * 0.3576 + b * 0.1805;
    var y = r * 0.2126 + g * 0.7152 + b * 0.0722;
    var z = r * 0.0193 + g * 0.1192 + b * 0.9505;

    Func<double, double> Fxyz = t => ((t > 0.008856) ? Math.Pow(t, (1.0 / 3.0)) : (7.787 * t + 16.0 / 116.0));

    return new CieLab
    {
        L = 116.0 * Fxyz(y / 1.0) - 16,
        A = 500.0 * (Fxyz(x / 0.9505) - Fxyz(y / 1.0)),
        B = 200.0 * (Fxyz(y / 1.0) - Fxyz(z / 1.0890))
    };
}

Idenya adalah menggunakan karakter bayangan seperti @AntoninLejsek do ('█', '▓', '▒', '░'), ini memungkinkan Anda untuk mendapatkan lebih dari 16 warna yang menggabungkan warna konsol (menggunakan Combine metode).

Di sini, kita dapat melakukan beberapa perbaikan dengan melakukan pra-komputasi warna untuk digunakan:

class ConsolePixel
{
    public char Char { get; set; }

    public ConsoleColor Forecolor { get; set; }
    public ConsoleColor Backcolor { get; set; }
    public CieLab Lab { get; set; }
}

static List<ConsolePixel> pixels;
private static void ComputeColors()
{
    pixels = new List<ConsolePixel>();

    char[] chars = { '█', '▓', '▒', '░' };

    int[] rs = { 0, 0, 0, 0, 128, 128, 128, 192, 128, 0, 0, 0, 255, 255, 255, 255 };
    int[] gs = { 0, 0, 128, 128, 0, 0, 128, 192, 128, 0, 255, 255, 0, 0, 255, 255 };
    int[] bs = { 0, 128, 0, 128, 0, 128, 0, 192, 128, 255, 0, 255, 0, 255, 0, 255 };

    for (int i = 0; i < 16; i++)
        for (int j = i + 1; j < 16; j++)
        {
            var l1 = RGBtoLab(rs[i], gs[i], bs[i]);
            var l2 = RGBtoLab(rs[j], gs[j], bs[j]);

            for (int k = 0; k < 4; k++)
            {
                var l = CieLab.Combine(l1, l2, (4 - k) / 4.0);

                pixels.Add(new ConsolePixel
                {
                    Char = chars[k],
                    Forecolor = (ConsoleColor)i,
                    Backcolor = (ConsoleColor)j,
                    Lab = l
                });
            }
        }
}

Peningkatan lain bisa akses langsung ke data gambar menggunakan LockBits alih-alih menggunakan GetPixel.

MEMPERBARUI: Jika gambar memiliki bagian dengan warna yang sama Anda dapat mempercepat proses potongan gambar karakter yang memiliki warna yang sama, bukan karakter individual:

public static void DrawImage(Bitmap source)
{
    int width = Console.WindowWidth - 1;
    int height = (int)(width * source.Height / 2.0 / source.Width);

    using (var bmp = new Bitmap(source, width, height))
    {
        var unit = GraphicsUnit.Pixel;
        using (var src = bmp.Clone(bmp.GetBounds(ref unit), PixelFormat.Format24bppRgb))
        {
            var bits = src.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadOnly, src.PixelFormat);
            byte[] data = new byte[bits.Stride * bits.Height];

            Marshal.Copy(bits.Scan0, data, 0, data.Length);

            for (int j = 0; j < height; j++)
            {
                StringBuilder builder = new StringBuilder();
                var fore = ConsoleColor.White;
                var back = ConsoleColor.Black;

                for (int i = 0; i < width; i++)
                {
                    int idx = j * bits.Stride + i * 3;
                    var pixel = DrawPixel(data[idx + 2], data[idx + 1], data[idx + 0]);


                    if (pixel.Forecolor != fore || pixel.Backcolor != back)
                    {
                        Console.ForegroundColor = fore;
                        Console.BackgroundColor = back;
                        Console.Write(builder);

                        builder.Clear();
                    }

                    fore = pixel.Forecolor;
                    back = pixel.Backcolor;
                    builder.Append(pixel.Char);
                }

                Console.ForegroundColor = fore;
                Console.BackgroundColor = back;
                Console.WriteLine(builder);
            }

            Console.ResetColor();
        }
    }
}

private static ConsolePixel DrawPixel(int r, int g, int b)
{
    var l = RGBtoLab(r, g, b);

    double diff = double.MaxValue;
    var pixel = pixels[0];

    foreach (var item in pixels)
    {
        var delta = CieLab.DeltaE(l, item.Lab);
        if (delta < diff)
        {
            diff = delta;
            pixel = item;
        }
    }

    return pixel;
}

Akhirnya, telepon DrawImage seperti ini:

static void Main(string[] args)
{
    ComputeColors();

    Bitmap image = new Bitmap("image.jpg", true);
    DrawImage(image);

}

Gambar Hasil:

Console1

Console2



Solusi berikut tidak didasarkan pada karakter tetapi memberikan gambar detail lengkap


Anda dapat menggambar melalui jendela apa pun menggunakan nya pawang untuk membuat Graphics obyek. Untuk mendapatkan pengendali aplikasi konsol, Anda dapat mengimpornya GetConsoleWindow:

[DllImport("kernel32.dll", EntryPoint = "GetConsoleWindow", SetLastError = true)]
private static extern IntPtr GetConsoleHandle();

Kemudian, buat grafik dengan handler (menggunakan Graphics.FromHwnd) dan menggambar gambar menggunakan metode di Graphicsobjek, misalnya:

static void Main(string[] args)
{            
    var handler = GetConsoleHandle();

    using (var graphics = Graphics.FromHwnd(handler))
    using (var image = Image.FromFile("img101.png"))
        graphics.DrawImage(image, 50, 50, 250, 200);
}

Version 1

Ini terlihat baik-baik saja tetapi jika konsol diubah ukurannya atau digulir, gambar menghilang karena jendela disegarkan (mungkin menerapkan beberapa jenis mekanisme untuk menggambar ulang gambar dimungkinkan dalam kasus Anda).


Solusi lain adalah menanamkan jendela (Form) ke dalam aplikasi konsol. Untuk melakukan ini, Anda harus mengimpor SetParent (dan MoveWindow untuk merelokasi jendela di dalam konsol):

[DllImport("user32.dll")]
public static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);

[DllImport("user32.dll", SetLastError = true)]
public static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint);

Maka Anda hanya perlu membuat Form dan mengatur BackgroundImage properti ke gambar yang diinginkan (lakukan pada a Thread atau Task untuk menghindari pemblokiran konsol):

static void Main(string[] args)
{
    Task.Factory.StartNew(ShowImage);

    Console.ReadLine();
}

static void ShowImage()
{
    var form = new Form
    {                
        BackgroundImage = Image.FromFile("img101.png"),
        BackgroundImageLayout = ImageLayout.Stretch
    };

    var parent = GetConsoleHandle();
    var child = form.Handle;

    SetParent(child, parent);
    MoveWindow(child, 50, 50, 250, 200, true);

    Application.Run(form);
}

Version2

Tentu saja Anda bisa mengaturnya FormBorderStyle = FormBorderStyle.None untuk menyembunyikan batas jendela (gambar kanan)

Dalam hal ini Anda dapat mengubah ukuran konsol dan gambar / jendela masih ada di sana.

Satu keuntungan dengan pendekatan ini adalah Anda dapat menemukan jendela di mana Anda inginkan dan mengubah gambar kapan saja dengan hanya mengubah BackgroundImage milik.


19
2018-04-29 22:14



Tidak ada jalan langsung. Tetapi Anda dapat mencoba menggunakan konverter gambar-ke-ascii-art seperti yang ini


4
2017-11-05 07:10



Ya, Anda dapat melakukannya, jika Anda meregangkan pertanyaan sedikit dengan membuka Form dari dalam aplikasi Konsol.

Di sini adalah bagaimana Anda dapat memiliki aplikasi konsol Anda membuka formulir dan menampilkan gambar:

  • sertakan dua referensi ini dalam proyek Anda: System.Drawing dan System.Windows.Forms
  • termasuk dua ruang nama juga:

using System.Windows.Forms;
using System.Drawing;

Lihat posting ini tentang cara melakukan itu!

Sekarang semua yang Anda butuhkan untuk menambahkan sesuatu seperti ini:

Form form1 = new Form();
form1.BackgroundImage = bmp;
form1.ShowDialog();

Tentu saja Anda juga bisa menggunakan PictureBox..

Dan Anda bisa menggunakannya form1.Show(); untuk menjaga konsol tetap hidup saat pratinjau menunjukkan ..

Pos asli: Tentu saja Anda tidak dapat menampilkan gambar dengan benar dalam jendela 25x80; bahkan jika Anda menggunakan jendela yang lebih besar dan memblokir grafik itu tidak akan menjadi preview tetapi berantakan!

Memperbarui: Sepertinya Anda bisa setelah semua GDI-menarik gambar ke Formulir Konsol; lihat jawaban taffer!


1
2017-11-05 10:35