• 找到镂空图片的坐标


    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Drawing.Imaging;
    using System.IO;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace BuildLogoImageCoord
    {
        public partial class FormMain : Form
        {
            public FormMain()
            {
                InitializeComponent();
            }
    
            private void btnText_Click(object sender, EventArgs e)
            {
                FindCoords(BuildTextImage(txtText.Text), txtText.Text);
                MessageBox.Show("Done!");
            }
    
            const int ImgWidth = 1920;
            const int ImgHeight = 1200;
            static Bitmap BuildTextImage(string text)
            {
                Bitmap bitmap = new Bitmap(ImgWidth, ImgHeight);
                Graphics g = Graphics.FromImage(bitmap);
                g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAliasGridFit;
                g.FillRectangle(new SolidBrush(Color.White), 0, 0, bitmap.Width, bitmap.Height);
                using (Font font1 = new Font("Arial", 1200, FontStyle.Bold, GraphicsUnit.Pixel))
                {
                    Rectangle rect1 = new Rectangle(0, 100, ImgWidth, ImgHeight);
                    StringFormat stringFormat = new StringFormat();
                    stringFormat.Alignment = StringAlignment.Center;
                    stringFormat.LineAlignment = StringAlignment.Center;
                    g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;
    
                    Font goodFont = FindGoodFont(g, text, rect1.Size, font1, GraphicsUnit.Pixel);
                    g.DrawString(text, goodFont, Brushes.Black, rect1, stringFormat);
                }
                g.Dispose();
                bitmap.Save(text + ".jpg", ImageFormat.Jpeg);
                return bitmap;
            }
    
            private static Font FindGoodFont(Graphics Graf, string sStringToFit,
                                        Size TextRoomAvail,
                                        Font FontToUse,
                                        GraphicsUnit FontUnit)
            {
                // Find out what the current size of the string in this font is
                SizeF RealSize = Graf.MeasureString(sStringToFit, FontToUse);
                if ((RealSize.Width <= TextRoomAvail.Width) && (RealSize.Height <= TextRoomAvail.Height))
                {
                    // The current font is fine...
                    return FontToUse;
                }
    
                // Either width or height is too big...
                // Usually either the height ratio or the width ratio
                // will be less than 1. Work them out...
                float HeightScaleRatio = TextRoomAvail.Height / RealSize.Height;
                float WidthScaleRatio = TextRoomAvail.Width / RealSize.Width;
    
                // We'll scale the font by the one which is furthest out of range...
                float ScaleRatio = (HeightScaleRatio < WidthScaleRatio) ? ScaleRatio = HeightScaleRatio : ScaleRatio = WidthScaleRatio;
                float ScaleFontSize = FontToUse.Size * ScaleRatio;
    
                // Retain whatever the style was in the old font...
                FontStyle OldFontStyle = FontToUse.Style;
    
                // Get rid of the old non working font...
                FontToUse.Dispose();
    
                // Tell the caller to use this newer smaller font.
                FontToUse = new Font(FontToUse.FontFamily,
                                        ScaleFontSize,
                                        OldFontStyle,
                                        FontUnit);
                return FontToUse;
            }
    
            private const int StartSize = 30;
    
            static void FindCoords(Bitmap bitmap, string text)
            {
                Bitmap reff = new Bitmap(ImgWidth, ImgHeight);
                Graphics g = Graphics.FromImage(reff);
                g.DrawImage(Image.FromFile("bgImage.jpg"), new Rectangle(0, 0, ImgWidth, ImgHeight));
    
                var rows = ImgHeight/StartSize;
                var cols = ImgWidth/StartSize;
                var coords = new List<string>();
                for (int j = 0; j < rows; j++)
                {
                    for (int i = 0; i < cols; i++)
                    {
                        var total = StartSize*StartSize;
                        var cur = 0;
                        for (int ii = 0; ii < StartSize; ii++)
                        {
                            for (int jj = 0; jj < StartSize; jj++)
                            {
                                var posx = i*StartSize + ii;
                                var posy = j*StartSize + jj;
                                byte color = bitmap.GetPixel(posx, posy).R;
                                if (color == 0)
                                {
                                    cur++;
                                    reff.SetPixel(posx, posy, Color.Transparent);
                                }
                            }
                        }
                        if (cur > total * 0.02)
                        {
                            coords.Add("[" + i + "," + j + "]");
                        }
                    }
                }
    
                StreamWriter sw = new StreamWriter(text + ".txt");
                sw.Write("[" + string.Join(",", coords.ToArray()) + "]");
                sw.Close();
    
                g.Dispose();
                reff.Save(text + "_cover.png", ImageFormat.Png);
            }
        }
    }
    

      

  • 相关阅读:
    vue中computed和watch的区别,以及适用场景
    vue中使用过的全局API
    厦门中控
    设置圆角的弧度,保持兼容性
    伪元素::after和::before
    SpringMVC
    mui问题
    错误记录
    Android错误
    Android之界面(布局文件layput)
  • 原文地址:https://www.cnblogs.com/sunnie/p/5718179.html
Copyright © 2020-2023  润新知