主頁 > 企業開發 > 調整大小后RichTextBox中的影像模糊

調整大小后RichTextBox中的影像模糊

2021-11-09 22:25:04 企業開發

我有一個 RichTextBox。我通過復制 粘貼插入影像。我使用裝飾器來調整影像大小。當 RTB 文本使用一個 XAML 檔案,每個影像使用一個 PNG 檔案時,RTB 將被保存。使用裝飾器和 SAVE 調整影像大小后,影像模糊。對于每次保存,影像變得越來越模糊 - 即使沒有進一步調整大小。請問我能做什么?

<Window x:Name="windowRTB" x:Class="RichTextBox.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    Title="MainWindow" Height="450" Width="800">
<Grid>
    <DockPanel Name="mainPanel">
        <ToolBar Name="mainToolBar" Height="30" DockPanel.Dock="Top" Background="{x:Null}">
            <Button Click="SaveContent" Loaded="Button_Loaded" Content="SAVE" FontWeight="Bold"/>
        </ToolBar>
        <RichTextBox Name="rtb" IsDocumentEnabled="True" AcceptsTab="True" IsReadOnly="False" TextChanged="Rtb_TextChanged">
        </RichTextBox>
    </DockPanel>
</Grid>
public partial class MainWindow : Window
{
    const string gc_pathAppDataXAML = @"C:\Users\RB\Documents\XAML\";
    const string gc_pathAppDataPNG = @"C:\Users\RB\Documents\PNG\";
    public MainWindow()
    {
        InitializeComponent();
    }

    private void Rtb_TextChanged(object sender, TextChangedEventArgs e)
    {
        foreach (Image img in rtb.FindChildren<Image>())
        {
            img.Loaded  = delegate
            {
                img.PreviewMouseDown  = new MouseButtonEventHandler(Image_PreviewMouseDown);
            };
        }
    }

    private void Image_PreviewMouseDown(object sender, MouseButtonEventArgs e)
    {
        if (rtb.IsReadOnly == false)
        {
            Image img = (Image)e.OriginalSource;

            AdornerLayer adornerLayer = AdornerLayer.GetAdornerLayer(img);
            if (adornerLayer != null)
            {
                adornerLayer.Add(new ResizingAdorner(img));
            }
        }
    }

    private void SaveContent(object sender, RoutedEventArgs e)
    {
        SaveXamlPackage(gc_pathAppDataXAML   "RTB-Test"   ".xaml");
    }

    private void SaveXamlPackage(string iv_fileName)
    {
        try
        {
            //Separately saving the images
            ExtractImages();

            //Save RTB content with placeholders for the images
            TextRange range1;
            FileStream fStream1;
            range1 = new TextRange(rtb.Document.ContentStart, rtb.Document.ContentEnd);
            fStream1 = new FileStream(iv_fileName, FileMode.Create);
            range1.Save(fStream1, DataFormats.XamlPackage);
            fStream1.Close();

            //Load RichTextBox
            LoadXamlPackage(iv_fileName);
        }
        catch (Exception error)
        {
            MessageBox.Show(error.Message);
            return;
        }
    }

    private void ExtractImages() //Separately saving the images
    {
        Image Image;
        int lv_cnt = 0;

        foreach (Block block in rtb.Document.Blocks)
        {
            if (block is Paragraph)
            {
                Paragraph paragraph = (Paragraph)block;
                foreach (Inline inline in paragraph.Inlines)
                {
                    if (inline is InlineUIContainer)
                    {
                        InlineUIContainer uiContainer = (InlineUIContainer)inline;
                        if (uiContainer.Child is System.Windows.Controls.Image)
                        {
                            lv_cnt  ;
                            Image = (Image)uiContainer.Child;
                            SaveToPng(Image, gc_pathAppDataPNG   "RTB-Test".ToString()   "-"   lv_cnt   ".png");

                            Image.Source = new BitmapImage(
                            new Uri("pack://application:,,,/RichTextBox;component/RTB_Platzhalter.png"));
                        }
                    }
                }
            }
            else if (block is BlockUIContainer)
            {
                BlockUIContainer container = (BlockUIContainer)block;
                if (container.Child is Image)
                {
                    lv_cnt  ;
                    Image = (Image)container.Child;
                    SaveToPng(Image, gc_pathAppDataPNG   "RTB-Test".ToString()   "-"   lv_cnt   ".png");

                    Image.Source = new BitmapImage(
                    new Uri("pack://application:,,,/RichTextBox;component/RTB_Platzhalter.png"));
                }
            }
        }

        void SaveToPng(FrameworkElement visual, string fileName)
        {
            var encoder = new PngBitmapEncoder();
            SaveUsingEncoder(visual, fileName, encoder);
        }

        void SaveUsingEncoder(FrameworkElement visual, string fileName, BitmapEncoder encoder)
        {
            RenderTargetBitmap bitmap = new RenderTargetBitmap((int)visual.ActualWidth, (int)visual.ActualHeight, 96, 96, PixelFormats.Pbgra32);
            Size visualSize = new Size(visual.ActualWidth, visual.ActualHeight);
            visual.Measure(visualSize);
            visual.Arrange(new Rect(visualSize));
            bitmap.Render(visual);
            BitmapFrame frame = BitmapFrame.Create(bitmap);
            encoder.Frames.Add(frame);

            using (FileStream stream = File.Create(fileName))
            {
                encoder.Save(stream);
            }
        }
    }

    private void LoadContent()  //While creating instance of windowRTB
    {
        LoadXamlPackage(gc_pathAppDataXAML   "RTB-Test".ToString()   ".xaml");
    }

    private void LoadXamlPackage(string iv_fileName)
    {
        try
        {
            TextRange range;
            FileStream fStream;
            if (File.Exists(iv_fileName))
            {
                range = new TextRange(rtb.Document.ContentStart, rtb.Document.ContentEnd);
                fStream = new FileStream(iv_fileName, FileMode.OpenOrCreate);
                range.Load(fStream, DataFormats.XamlPackage);
                fStream.Close();
            }

            LoadImages();
        }
        catch (Exception error)
        {
            MessageBox.Show(error.Message);
            return;
        }
    }

    private void LoadImages() //Reloading of separately saved images
    {
        Image Image;
        int lv_cnt = 0;

        foreach (Block block in rtb.Document.Blocks)
        {
            if (block is Paragraph)
            {
                Paragraph paragraph = (Paragraph)block;
                foreach (Inline inline in paragraph.Inlines)
                {
                    if (inline is InlineUIContainer)
                    {
                        InlineUIContainer uiContainer = (InlineUIContainer)inline;
                        if (uiContainer.Child is System.Windows.Controls.Image)
                        {
                            lv_cnt  ;
                            Image = (System.Windows.Controls.Image)uiContainer.Child;
                            Image.Source = null;
                            using (FileStream fs = new FileStream(gc_pathAppDataPNG   "RTB-Test".ToString()   "-"   lv_cnt   ".png", FileMode.Open))
                            {
                                BitmapImage imageSource = new BitmapImage();
                                imageSource.BeginInit();
                                imageSource.CacheOption = BitmapCacheOption.OnLoad;
                                imageSource.StreamSource = fs;
                                imageSource.EndInit();
                                Image.Source = imageSource;
                            }
                        }
                    }
                }
            }
            else if (block is BlockUIContainer)
            {
                BlockUIContainer container = (BlockUIContainer)block;
                if (container.Child is System.Windows.Controls.Image)
                {
                    lv_cnt  ;
                    Image = (System.Windows.Controls.Image)container.Child;
                    using (FileStream fs = new FileStream(gc_pathAppDataPNG   "RTB-Test".ToString()   "-"   lv_cnt   ".png", FileMode.Open))
                    {
                        BitmapImage imageSource = new BitmapImage();
                        imageSource.BeginInit();
                        imageSource.CacheOption = BitmapCacheOption.OnLoad;
                        imageSource.StreamSource = fs;
                        imageSource.EndInit();
                        Image.Source = imageSource;
                    }
                }
            }
        }
    }


    private void Button_Loaded(object sender, RoutedEventArgs e)
    {
        LoadContent();
    }
}

public class ResizingAdorner : Adorner
{
    // Resizing adorner uses Thumbs for visual elements.   
    // The Thumbs have built-in mouse input handling. 
    Thumb topLeft, topRight, bottomLeft, bottomRight;

    // To store and manage the adorner's visual children. 
    VisualCollection visualChildren;

    // Initialize the ResizingAdorner. 
    public ResizingAdorner(UIElement adornedElement) : base(adornedElement)
    {
        visualChildren = new VisualCollection(this);

        // Call a helper method to initialize the Thumbs 
        // with a customized cursors. 
        BuildAdornerCorner(ref topLeft, Cursors.SizeNWSE);
        BuildAdornerCorner(ref topRight, Cursors.SizeNESW);
        BuildAdornerCorner(ref bottomLeft, Cursors.SizeNESW);
        BuildAdornerCorner(ref bottomRight, Cursors.SizeNWSE);

        // Add handlers for resizing. 
        bottomLeft.DragDelta  = new DragDeltaEventHandler(HandleBottomLeft);
        bottomRight.DragDelta  = new DragDeltaEventHandler(HandleBottomRight);
        topLeft.DragDelta  = new DragDeltaEventHandler(HandleTopLeft);
        topRight.DragDelta  = new DragDeltaEventHandler(HandleTopRight);
    }

    // Handler for resizing from the bottom-right. 
    void HandleBottomRight(object sender, DragDeltaEventArgs args)
    {
        FrameworkElement adornedElement = this.AdornedElement as FrameworkElement;
        Thumb hitThumb = sender as Thumb;

        if (adornedElement == null || hitThumb == null) return;
        FrameworkElement parentElement = adornedElement.Parent as FrameworkElement;

        // Ensure that the Width and Height are properly initialized after the resize. 
        EnforceSize(adornedElement);

        // Change the size by the amount the user drags the mouse, as long as it's larger  
        // than the width or height of an adorner, respectively. 
        double lv_oldWidth = adornedElement.Width;
        adornedElement.Width = Math.Max(adornedElement.Width   args.HorizontalChange, hitThumb.DesiredSize.Width);
        adornedElement.Height = adornedElement.Height * adornedElement.Width / lv_oldWidth;
    }

    // Handler for resizing from the bottom-left. 
    void HandleBottomLeft(object sender, DragDeltaEventArgs args)
    {
        FrameworkElement adornedElement = AdornedElement as FrameworkElement;
        Thumb hitThumb = sender as Thumb;

        if (adornedElement == null || hitThumb == null) return;

        // Ensure that the Width and Height are properly initialized after the resize. 
        EnforceSize(adornedElement);

        // Change the size by the amount the user drags the mouse, as long as it's larger  
        // than the width or height of an adorner, respectively. 
        double lv_oldWidth = adornedElement.Width;
        adornedElement.Width = Math.Max(adornedElement.Width - args.HorizontalChange, hitThumb.DesiredSize.Width);
        adornedElement.Height = adornedElement.Height * adornedElement.Width / lv_oldWidth;
    }

    // Handler for resizing from the top-right. 
    void HandleTopRight(object sender, DragDeltaEventArgs args)
    {
        FrameworkElement adornedElement = this.AdornedElement as FrameworkElement;
        Thumb hitThumb = sender as Thumb;

        if (adornedElement == null || hitThumb == null) return;
        FrameworkElement parentElement = adornedElement.Parent as FrameworkElement;

        // Ensure that the Width and Height are properly initialized after the resize. 
        EnforceSize(adornedElement);

        // Change the size by the amount the user drags the mouse, as long as it's larger  
        // than the width or height of an adorner, respectively. 
        double lv_oldWidth = adornedElement.Width;
        adornedElement.Width = Math.Max(adornedElement.Width   args.HorizontalChange, hitThumb.DesiredSize.Width);
        adornedElement.Height = adornedElement.Height * adornedElement.Width / lv_oldWidth;
    }

    // Handler for resizing from the top-left. 
    void HandleTopLeft(object sender, DragDeltaEventArgs args)
    {
        FrameworkElement adornedElement = AdornedElement as FrameworkElement;
        Thumb hitThumb = sender as Thumb;

        if (adornedElement == null || hitThumb == null) return;

        // Ensure that the Width and Height are properly initialized after the resize. 
        EnforceSize(adornedElement);

        // Change the size by the amount the user drags the mouse, as long as it's larger  
        // than the width or height of an adorner, respectively. 
        double lv_oldWidth = adornedElement.Width;
        adornedElement.Width = Math.Max(adornedElement.Width - args.HorizontalChange, hitThumb.DesiredSize.Width);
        adornedElement.Height = adornedElement.Height * adornedElement.Width / lv_oldWidth;
    }

    // Arrange the Adorners. 
    protected override Size ArrangeOverride(Size finalSize)
    {
        // desiredWidth and desiredHeight are the width and height of the element that's being adorned.   
        // These will be used to place the ResizingAdorner at the corners of the adorned element.   
        double desiredWidth = AdornedElement.DesiredSize.Width;
        double desiredHeight = AdornedElement.DesiredSize.Height;
        // adornerWidth & adornerHeight are used for placement as well. 
        double adornerWidth = this.DesiredSize.Width;
        double adornerHeight = this.DesiredSize.Height;

        topLeft.Arrange(new Rect(-adornerWidth / 2, -adornerHeight / 2, adornerWidth, adornerHeight));
        topRight.Arrange(new Rect(desiredWidth - adornerWidth / 2, -adornerHeight / 2, adornerWidth, adornerHeight));
        bottomLeft.Arrange(new Rect(-adornerWidth / 2, desiredHeight - adornerHeight / 2, adornerWidth, adornerHeight));
        bottomRight.Arrange(new Rect(desiredWidth - adornerWidth / 2, desiredHeight - adornerHeight / 2, adornerWidth, adornerHeight));

        // Return the final size. 
        return finalSize;
    }

    // Helper method to instantiate the corner Thumbs, set the Cursor property,  
    // set some appearance properties, and add the elements to the visual tree. 
    void BuildAdornerCorner(ref Thumb cornerThumb, Cursor customizedCursor)
    {
        if (cornerThumb != null) return;

        cornerThumb = new Thumb();

        // Set some arbitrary visual characteristics. 
        cornerThumb.Cursor = customizedCursor;
        cornerThumb.Height = cornerThumb.Width = 10;
        cornerThumb.Opacity = 0.40;
        cornerThumb.Background = new SolidColorBrush(Colors.MediumBlue);

        visualChildren.Add(cornerThumb);
    }

    // This method ensures that the Widths and Heights are initialized.  Sizing to content produces 
    // Width and Height values of Double.NaN.  Because this Adorner explicitly resizes, the Width and Height 
    // need to be set first.  It also sets the maximum size of the adorned element. 
    void EnforceSize(FrameworkElement adornedElement)
    {
        if (adornedElement.Width.Equals(Double.NaN))
            adornedElement.Width = adornedElement.DesiredSize.Width;
        if (adornedElement.Height.Equals(Double.NaN))
            adornedElement.Height = adornedElement.DesiredSize.Height;

        FrameworkElement parent = adornedElement.Parent as FrameworkElement;
        if (parent != null)
        {
            adornedElement.MaxHeight = parent.ActualHeight;
            adornedElement.MaxWidth = parent.ActualWidth;
        }
    }
    // Override the VisualChildrenCount and GetVisualChild properties to interface with  
    // the adorner's visual collection. 
    protected override int VisualChildrenCount { get { return visualChildren.Count; } }
    protected override Visual GetVisualChild(int index) { return visualChildren[index]; }
}

/// <summary>
/// Helper methods for UI-related tasks.
/// </summary>
public static class TreeHelper
{
    #region find parent
    public static T TryFindParent<T>(this DependencyObject child)
        where T : DependencyObject
    {
        //get parent item
        DependencyObject parentObject = GetParentObject(child);

        //we've reached the end of the tree
        if (parentObject == null) return null;

        //check if the parent matches the type we're looking for
        T parent = parentObject as T;
        if (parent != null)
        {
            return parent;
        }
        else
        {
            //use recursion to proceed with next level
            return TryFindParent<T>(parentObject);
        }
    }

    public static DependencyObject GetParentObject(this DependencyObject child)
    {
        if (child == null) return null;

        //handle content elements separately
        ContentElement contentElement = child as ContentElement;
        if (contentElement != null)
        {
            DependencyObject parent = ContentOperations.GetParent(contentElement);
            if (parent != null) return parent;

            FrameworkContentElement fce = contentElement as FrameworkContentElement;
            return fce != null ? fce.Parent : null;
        }

        //also try searching for parent in framework elements (such as DockPanel, etc)
        FrameworkElement frameworkElement = child as FrameworkElement;
        if (frameworkElement != null)
        {
            DependencyObject parent = frameworkElement.Parent;
            if (parent != null) return parent;
        }

        //if it's not a ContentElement/FrameworkElement, rely on VisualTreeHelper
        return VisualTreeHelper.GetParent(child);
    }

    #endregion

    #region find children

    public static IEnumerable<T> FindChildren<T>(this DependencyObject source) where T : DependencyObject
    {
        if (source != null)
        {
            var childs = GetChildObjects(source);
            foreach (DependencyObject child in childs)
            {
                //analyze if children match the requested type
                if (child != null && child is T)
                {
                    yield return (T)child;
                }

                //recurse tree
                foreach (T descendant in FindChildren<T>(child))
                {
                    yield return descendant;
                }
            }
        }
    }

    public static IEnumerable<DependencyObject> GetChildObjects(this DependencyObject parent)
    {
        if (parent == null) yield break;

        if (parent is ContentElement || parent is FrameworkElement)
        {
            //use the logical tree for content / framework elements
            foreach (object obj in LogicalTreeHelper.GetChildren(parent))
            {
                var depObj = obj as DependencyObject;
                if (depObj != null) yield return (DependencyObject)obj;
            }
        }
        else
        {
            //use the visual tree per default
            int count = VisualTreeHelper.GetChildrenCount(parent);
            for (int i = 0; i < count; i  )
            {
                yield return VisualTreeHelper.GetChild(parent, i);
            }
        }
    }

    #endregion

    #region find from point

    public static T TryFindFromPoint<T>(UIElement reference, Point point)
        where T : DependencyObject
    {
        DependencyObject element = reference.InputHitTest(point) as DependencyObject;

        if (element == null) return null;
        else if (element is T) return (T)element;
        else return TryFindParent<T>(element);
    }

    #endregion
}

uj5u.com熱心網友回復:

上面代碼中的問題是使用視覺物件的大小而不是源影像大小(及其內容)。因此,當您更改檔案中影像的大小(無論縮小還是增大大小都沒有關系)然后保存檔案時,保存的影像總是會失去質量。

解決方案是使用原始大小和內容保存影像。

因此,進行更改以使用影像源(從@Knuspakeks ( 1)指出的源轉換影像):

void SaveToPng(Image image, string fileName)
{
    var encoder = new PngBitmapEncoder();                
    SaveUsingEncoder(image, fileName, encoder);
}
   
void SaveUsingEncoder(Image image, string fileName, BitmapEncoder encoder)
{
    encoder.Frames.Add(BitmapFrame.Create((BitmapSource)image.Source));
    using (FileStream stream = new FileStream(fileName, FileMode.Create))
        encoder.Save(stream);
}

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/354037.html

標籤:C# 小白 图片 富文本框 装饰者

上一篇:為三個不同頁面上的三個不同影像添加一個唯一的div?

下一篇:如何在flutter中顯示來自api回應的png影像?

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • IEEE1588PTP在數字化變電站時鐘同步方面的應用

    IEEE1588ptp在數字化變電站時鐘同步方面的應用 京準電子科技官微——ahjzsz 一、電力系統時間同步基本概況 隨著對IEC 61850標準研究的不斷深入,國內外學者提出基于IEC61850通信標準體系建設數字化變電站的發展思路。數字化變電站與常規變電站的顯著區別在于程序層傳統的電流/電壓互 ......

    uj5u.com 2020-09-10 03:51:52 more
  • HTTP request smuggling CL.TE

    CL.TE 簡介 前端通過Content-Length處理請求,通過反向代理或者負載均衡將請求轉發到后端,后端Transfer-Encoding優先級較高,以TE處理請求造成安全問題。 檢測 發送如下資料包 POST / HTTP/1.1 Host: ac391f7e1e9af821806e890 ......

    uj5u.com 2020-09-10 03:52:11 more
  • 網路滲透資料大全單——漏洞庫篇

    網路滲透資料大全單——漏洞庫篇漏洞庫 NVD ——美國國家漏洞庫 →http://nvd.nist.gov/。 CERT ——美國國家應急回應中心 →https://www.us-cert.gov/ OSVDB ——開源漏洞庫 →http://osvdb.org Bugtraq ——賽門鐵克 →ht ......

    uj5u.com 2020-09-10 03:52:15 more
  • 京準講述NTP時鐘服務器應用及原理

    京準講述NTP時鐘服務器應用及原理京準講述NTP時鐘服務器應用及原理 安徽京準電子科技官微——ahjzsz 北斗授時原理 授時是指接識訓通過某種方式獲得本地時間與北斗標準時間的鐘差,然后調整本地時鐘使時差控制在一定的精度范圍內。 衛星導航系統通常由三部分組成:導航授時衛星、地面檢測校正維護系統和用戶 ......

    uj5u.com 2020-09-10 03:52:25 more
  • 利用北斗衛星系統設計NTP網路時間服務器

    利用北斗衛星系統設計NTP網路時間服務器 利用北斗衛星系統設計NTP網路時間服務器 安徽京準電子科技官微——ahjzsz 概述 NTP網路時間服務器是一款支持NTP和SNTP網路時間同步協議,高精度、大容量、高品質的高科技時鐘產品。 NTP網路時間服務器設備采用冗余架構設計,高精度時鐘直接來源于北斗 ......

    uj5u.com 2020-09-10 03:52:35 more
  • 詳細解讀電力系統各種對時方式

    詳細解讀電力系統各種對時方式 詳細解讀電力系統各種對時方式 安徽京準電子科技官微——ahjzsz,更多資料請添加VX 衛星同步時鐘是我京準公司開發研制的應用衛星授時時技術的標準時間顯示和發送的裝置,該裝置以M國全球定位系統(GLOBAL POSITIONING SYSTEM,縮寫為GPS)或者我國北 ......

    uj5u.com 2020-09-10 03:52:45 more
  • 如何保證外包團隊接入企業內網安全

    不管企業規模的大小,只要企業想省錢,那么企業的某些服務就一定會采用外包的形式,然而看似美好又經濟的策略,其實也有不好的一面。下面我通過安全的角度來聊聊使用外包團的安全隱患問題。 先看看什么服務會使用外包的,最常見的就是話務/客服這種需要大量重復性、無技術性的服務,或者是一些銷售外包、特殊的職能外包等 ......

    uj5u.com 2020-09-10 03:52:57 more
  • PHP漏洞之【整型數字型SQL注入】

    0x01 什么是SQL注入 SQL是一種注入攻擊,通過前端帶入后端資料庫進行惡意的SQL陳述句查詢。 0x02 SQL整型注入原理 SQL注入一般發生在動態網站URL地址里,當然也會發生在其它地發,如登錄框等等也會存在注入,只要是和資料庫打交道的地方都有可能存在。 如這里http://192.168. ......

    uj5u.com 2020-09-10 03:55:40 more
  • [GXYCTF2019]禁止套娃

    git泄露獲取原始碼 使用GET傳參,引數為exp 經過三層過濾執行 第一層過濾偽協議,第二層過濾帶引數的函式,第三層過濾一些函式 preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'] (?R)參考當前正則運算式,相當于匹配函式里的引數 因此傳遞 ......

    uj5u.com 2020-09-10 03:56:07 more
  • 等保2.0實施流程

    流程 結論 ......

    uj5u.com 2020-09-10 03:56:16 more
最新发布
  • 使用Django Rest framework搭建Blog

    在前面的Blog例子中我們使用的是GraphQL, 雖然GraphQL的使用處于上升趨勢,但是Rest API還是使用的更廣泛一些. 所以還是決定回到傳統的rest api framework上來, Django rest framework的官網上給了一個很好用的QuickStart, 我參考Qu ......

    uj5u.com 2023-04-20 08:17:54 more
  • 記錄-new Date() 我忍你很久了!

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 大家平時在開發的時候有沒被new Date()折磨過?就是它的諸多怪異的設定讓你每每用的時候,都可能不小心踩坑。造成程式意外出錯,卻一下子找不到問題出處,那叫一個煩透了…… 下面,我就列舉它的“四宗罪”及應用思考 可惡的四宗罪 1. Sa ......

    uj5u.com 2023-04-20 08:17:47 more
  • 使用Vue.js實作文字跑馬燈效果

    實作文字跑馬燈效果,首先用到 substring()截取 和 setInterval計時器 clearInterval()清除計時器 效果如下: 實作代碼如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta ......

    uj5u.com 2023-04-20 08:12:31 more
  • JavaScript 運算子

    JavaScript 運算子/運算子 在 JavaScript 中,有一些運算子可以使代碼更簡潔、易讀和高效。以下是一些常見的運算子: 1、可選鏈運算子(optional chaining operator) ?.是可選鏈運算子(optional chaining operator)。?. 可選鏈操 ......

    uj5u.com 2023-04-20 08:02:25 more
  • CSS—相對單位rem

    一、概述 rem是一個相對長度單位,它的單位長度取決于根標簽html的字體尺寸。rem即root em的意思,中文翻譯為根em。瀏覽器的文本尺寸一般默認為16px,即默認情況下: 1rem = 16px rem布局原理:根據CSS媒體查詢功能,更改根標簽的字體尺寸,實作rem單位隨螢屏尺寸的變化,如 ......

    uj5u.com 2023-04-20 08:02:21 more
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 08:01:50 more
  • 如何在 vue3 中使用 jsx/tsx?

    我們都知道,通常情況下我們使用 vue 大多都是用的 SFC(Signle File Component)單檔案組件模式,即一個組件就是一個檔案,但其實 Vue 也是支持使用 JSX 來撰寫組件的。這里不討論 SFC 和 JSX 的好壞,這個仁者見仁智者見智。本篇文章旨在帶領大家快速了解和使用 Vu ......

    uj5u.com 2023-04-20 08:01:37 more
  • 【Vue2.x原始碼系列06】計算屬性computed原理

    本章目標:計算屬性是如何實作的?計算屬性快取原理以及洋蔥模型的應用?在初始化Vue實體時,我們會給每個計算屬性都創建一個對應watcher,我們稱之為計算屬性watcher ......

    uj5u.com 2023-04-20 08:01:31 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:01:10 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:00:32 more