کنسول ایپلی کیشن میں تصویر دکھائیں۔

Display Image Console Application



حل:

اگرچہ کنسول میں تصویر دکھانا کنسول کا مطلوبہ استعمال نہیں ہے ، آپ یقینی طور پر چیزوں کو ہیک کر سکتے ہیں ، کیونکہ کنسول ونڈو صرف ایک ونڈو ہے ، کسی بھی دوسری ونڈوز کی طرح۔

دراصل ، ایک بار جب میں نے گرافکس سپورٹ کے ساتھ کنسول ایپلی کیشنز کے لیے ٹیکسٹ کنٹرول لائبریری تیار کرنا شروع کر دی ہے۔ میں نے اسے کبھی ختم نہیں کیا ، حالانکہ میرے پاس تصوراتی ڈیمو موجود ہے:



تصویر کے ساتھ ٹیکسٹ کنٹرول



اور اگر آپ کنسول فونٹ سائز حاصل کرتے ہیں ، تو آپ تصویر کو بالکل ٹھیک رکھ سکتے ہیں۔



اس طرح آپ یہ کر سکتے ہیں:

جامد باطل مین (سٹرنگ [] آرگس) {Console.WriteLine ('گرافکس ان کنسول ونڈو!') پوائنٹ مقام = نیا پوائنٹ (10 ، 10) سائز امیج سائز = نیا سائز (20 ، 10) // حروف میں مطلوبہ تصویر کا سائز // کچھ پلیس ہولڈرز Console.SetCursorPosition (location.X - 1، location.Y) ڈرا کریں۔ کنسول لکھنا ('>') Console.SetCursorPosition (location.X + imageSize.Width، location.Y)؛ کنسول لکھنا ('') Console.SetCursorPosition (location.X + imageSize.Width، location.Y + imageSize.Height - 1)؛ کنسول رائٹ لائن ('<'); string path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonPictures), @'Sample Pictures	ulips.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); } } }  

یہ ہے کہ آپ موجودہ کنسول فونٹ سائز کیسے حاصل کرسکتے ہیں:

نجی جامد سائز GetConsoleFontSize () {// کنسول سے بفر ہینڈل حاصل کرنا IntPtr outHandle = CreateFile ('CONOUT $' ، GENERIC_READ | GENERIC_WRITE ، FILE_SHARE_READ | FILE_SHARE_WRITE ، IntPtr.Zero ، OPEN_Zero ، OPEN_Zero ، OPEN_Zero ، OPEN_Zero ، OPEN_Zero int errorCode = Marshal.GetLastWin32Error () اگر (outHandle.ToInt32) } ConsoleFontInfo cfi = new ConsoleFontInfo ()؛ اگر (! } نیا سائز واپس کریں (cfi.dwFontSize.X ، cfi.dwFontSize.Y) }

اور مطلوبہ اضافی WinApi کالز ، مستقل اور اقسام:



[DllImport ('kernel32.dll' ، SetLastError = true)] نجی جامد بیرونی IntPtr GetConsoleWindow ()؛ [DllImport ('kernel32.dll' ، SetLastError = true)] نجی جامد بیرونی IntPtr CreateFile (string lpFileName، int dwDesiredAccess، int dwShareMode، IntPtr lpSecurityAttributes، int dwCreationDisposition، Int dTTTTFTTANDTFLETSA، int dTTTFLETASTFLETS [DllImport ('kernel32.dll' ، SetLastError = true)] نجی جامد بیرونی بول GetCurrentConsoleFont (IntPtr hConsoleOutput، bool bMaximumWindow، [Out] [MarshalAs (UnmanagedType.LPStruct)] ConsoleFontConfontFontFontFontFontFontFontFont [StructLayout (LayoutKind.Sequential)] اندرونی کلاس ConsoleFontInfo {اندرونی int nFont؛ اندرونی کوارڈ dwFontSize } [StructLayout (LayoutKind.Explicit)] اندرونی struct coord {[FieldOffset (0)] اندرونی مختصر X؛ [فیلڈ آفسیٹ (2)] اندرونی مختصر Y } نجی const int GENERIC_READ = غیر چیک شدہ ((int) 0x80000000) نجی const int GENERIC_WRITE = 0x40000000 نجی const int FILE_SHARE_READ = 1 نجی const int FILE_SHARE_WRITE = 2 نجی const int INVALID_HANDLE_VALUE = -1 نجی const int OPEN_EXISTING = 3

اور نتیجہ:

[ تصویر کی تفصیل یہاں درج کریں۔


میں نے مزید codeDieterMeemken کے کوڈ کے ساتھ کھیلا۔ میں نے عمودی ریزولوشن کو آدھا کر دیا اور via کے ذریعے گھٹنا شامل کیا۔ بائیں طرف ڈائٹر میمکن نتیجہ ہے ، دائیں طرف میرا۔ نچلے حصے میں اصل تصویر کا سائز تبدیل کیا گیا ہے تاکہ آؤٹ پٹ سے مل سکے۔ تصویر کی تفصیل یہاں درج کریں۔جبکہ Malwyns تبادلوں کی تقریب متاثر کن ہے ، یہ تمام سرمئی رنگوں کا استعمال نہیں کرتا ، افسوس کیا ہے۔

جامد int [] cColors = {0x000000، 0x000080، 0x008000، 0x008080، 0x800000، 0x800080، 0x808000، 0xC0C0C0، 0x808080، 0x0000FF، 0x00FFFF، 0x00FFFF، 0xFFFF، 0xFFFF عوامی جامد باطل 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؛ cFore1 && rChar 50000)) // بہت زیادہ عجیب امتزاجوں کو مسترد کریں {اگر (iScore۔ استعمال:

بٹ میپ bmpSrc = نیا بٹ میپ (@'HuwnC.gif' ، سچ) کنسول رائٹ امیج (bmpSrc)

ترمیم

رنگ کا فاصلہ ایک پیچیدہ موضوع ہے (یہاں ، یہاں اور ان صفحات پر روابط ...) میں نے YUV میں فاصلے کا حساب لگانے کی کوشش کی اور نتائج RGB کے مقابلے میں بدتر تھے۔ وہ لیب اور ڈیلٹا کے ساتھ بہتر ہوسکتے ہیں ، لیکن میں نے اس کی کوشش نہیں کی۔ RGB میں فاصلہ کافی اچھا لگتا ہے۔ درحقیقت RGB کلر اسپیس میں یوکلیڈین اور مین ہٹن فاصلے دونوں کے لیے نتائج بہت ملتے جلتے ہیں ، لہذا مجھے شبہ ہے کہ منتخب کرنے کے لیے بہت کم رنگ ہیں۔

باقی صرف رنگ اور پیٹرن (= علامتوں) کے تمام مجموعوں کے مقابلے میں رنگ کا موازنہ ہے۔ میں نے fill کے لیے بھرنے کا تناسب 1/4 ، 2/4 ، 3/4 اور 4/4 بتایا۔ اس صورت میں تیسری علامت پہلی سے بے کار ہے۔ لیکن اگر تناسب اتنا یکساں نہیں تھا (فونٹ پر منحصر ہے) ، نتائج بدل سکتے ہیں ، لہذا میں نے اسے مستقبل کی بہتری کے لیے وہاں چھوڑ دیا۔ علامت کے اوسط رنگ کا حساب بھرنے کے تناسب کے مطابق فارورگراڈ کلر اور بیک گراؤنڈ کلر کے وزن کے حساب سے کیا جاتا ہے۔ یہ لکیری رنگوں کو فرض کرتا ہے ، جو بڑی سادگی بھی ہے۔ اس لیے ابھی بہتری کی گنجائش باقی ہے۔


اگر آپ دو بار ASCII 219 (█) استعمال کرتے ہیں تو آپ کے پاس پکسل (██) جیسی کوئی چیز ہے۔ اب آپ اپنے کنسول ایپلی کیشن میں پکسلز کی مقدار اور رنگوں کی تعداد سے محدود ہیں۔

  • اگر آپ پہلے سے طے شدہ ترتیبات رکھتے ہیں تو آپ کے پاس 39x39 پکسل ہے ، اگر آپ مزید چاہتے ہیں تو آپ اپنے کنسول کا سائز تبدیل کر سکتے ہیں۔کنسول ونڈو ہائٹ = resSize.Height + 1 and اورکنسول ونڈو چوڑائی = نتیجہ سائز. چوڑائی * 2

  • آپ کو تصویر کا پہلو تناسب جہاں تک ممکن ہو رکھنا ہوگا ، لہذا زیادہ تر معاملات میں آپ کے پاس 39x39 نہیں ہوگا۔

  • مالوین نے تبدیل کرنے کے لیے مکمل طور پر کم طریقہ کار شائع کیا۔System.Drawing.Color toSystem.ConsoleColor۔

تو میرا نقطہ نظر ہوگا

سسٹم ڈرائنگ کا استعمال کرتے ہوئے عوامی جامد int ToConsoleColor (System.Drawing.Color c) int index = (cR> 128 public static void ConsoleWriteImage (Bitmap src) {int min = 39؛ decimal pct = Math.Min (decimal.Divide (min، src.Width) ، اعشاریہ۔ تقسیم (منٹ ، ایس آر سی۔ اونچائی) res) for کے لیے (int i = 0؛ iتو تم کر سکتے ہو

ConsoleWriteImage (نیا بٹ میپ (@'C:  image.gif'))

نمونہ ان پٹ:

نمونہ پیداوار: