Tikz - выделение текста на изображении

Tikz - выделение текста на изображении

Как выделить текст на изображении с помощью tikz, используя прямоугольник, и заполнить остальную часть страницы серым (или непрозрачным черным) тоном, см. пример ниже (взят изздесь)?

введите описание изображения здесь

Вы можете увидеть скриншот, сделанный в GIMP, где я просто выделяю текст с помощью инструмента выбора прямоугольника. Как мне добиться похожего эффекта с помощью tikz в xetex (без желтых пунктирных линий на границах)?

Мой код на данный момент такой:

\begin{tikzpicture}[remember picture, overlay]
        \node [anchor=south west,inner sep=0] (A) at (0,0) {\includegraphics[width=\linewidth, height=\paperheight]{image}}{};
        \fill [draw=none, fill=black, fill opacity=0.3]
        (0,0) -- 
        (A.north west) -- (A.north east) -- (A.south east) -- 
        (0,0) -- (0,0) -- cycle;
        \filldraw [fill=white, draw=white, fill opacity=.3] (3.2,3.2) rectangle (14.6,10.5);
    \end{tikzpicture}

Проблема, с которой я столкнулся при использовании этого кода, заключается в том, что заполнение всей страницы непрозрачным черным цветом и заполнение прямоугольника непрозрачным белым цветом приводит к получению непрозрачного серого цвета.

решение1

Вот рецепт и приложение. Сначала рецепт, используяэтот ответ.

  1. Добавьте сетку сверху.
  2. Нарисуйте контур, который вы хотите выделить.
  3. Используйте контур в even odd ruleзаливке (и удалите сетку).

Я намеренно использовал документ, в котором вы, возможно, не захотите использовать горизонтальный блок.

\documentclass[tikz,border=3.14mm]{standalone}
\begin{document}
\foreach \X in {0,1,2}
{\begin{tikzpicture}
    \node[anchor=south west,inner sep=0] (image) at (0,0) 
    {\includegraphics[width=0.9\textwidth]{Dunlap_broadside_copy_of_the_United_States_Declaration_of_Independence,_LOC.jpg}};
    % ^^^ https://upload.wikimedia.org/wikipedia/commons/4/4e/Dunlap_broadside_copy_of_the_United_States_Declaration_of_Independence%2C_LOC.jpg
    \begin{scope}[x={(image.south east)},y={(image.north west)}]
      \path[use as bounding box] (-0.1,-0.1) rectangle (1,1);
       % ^^^ only for animation
      \ifnum\X<2
        \draw[help lines,xstep=.1,ystep=.1] (0,0) grid (1,1);
        \foreach \x in {0,1,...,9} { \node [anchor=north] at (\x/10,0) {0.\x}; }
        \foreach \y in {0,1,...,9} { \node [anchor=east] at (0,\y/10) {0.\y}; }
      \fi   
      \ifnum\X=1    
        \draw (0.11,0.4) -- (0.37,0.404) --  (0.37,0.414) -- (0.11,0.41) -- cycle;
      \fi
      \ifnum\X=2
        \fill[even odd rule,opacity=0.4]
        (0.11,0.4) -- (0.37,0.404) --  (0.37,0.414) -- (0.11,0.41) -- cycle
        (0,0) rectangle (1,1);
      \fi       
    \end{scope} 
\end{tikzpicture}}
\end{document}

введите описание изображения здесь

Конечно, в конце концов вы отбрасываете все вспомогательные вещи, чтобы прийти к

\documentclass[tikz,border=3.14mm]{standalone}
\begin{document}
\begin{tikzpicture}
    \node[anchor=south west,inner sep=0] (image) at (0,0) 
    {\includegraphics[width=0.9\textwidth]{Dunlap_broadside_copy_of_the_United_States_Declaration_of_Independence,_LOC.jpg}};
    % ^^^ https://upload.wikimedia.org/wikipedia/commons/4/4e/Dunlap_broadside_copy_of_the_United_States_Declaration_of_Independence%2C_LOC.jpg
    \begin{scope}[x={(image.south east)},y={(image.north west)}]
        \fill[even odd rule,opacity=0.4]
        (0.11,0.4) -- (0.37,0.404) --  (0.37,0.414) -- (0.11,0.41) -- cycle
        (0,0) rectangle (1,1);
    \end{scope} 
\end{tikzpicture}
\end{document}

введите описание изображения здесь

введите описание изображения здесь

Я не хочу вдаваться в подробности относительно того, связан ли мой выбор выделенного текста со стеной на границе с Мексикой.

решение2

В зависимости от формата изображений не tikzтребуется:

\documentclass{article}
\usepackage{graphicx,stackengine,trimclip}
\begin{document}
\stackinset{l}{150pt}{b}{130pt}{%
  \clipbox{150pt 130pt 100pt 50pt}{\includegraphics{example-image.jpg}}%
}{%
  \includegraphics[decodearray={.3 .5 .3 .5 .3 .5}]{example-image.jpg}%
}
\end{document}

введите описание изображения здесь

В зависимости от цветовой палитры decodearrayможет потребоваться корректировка:

\documentclass{article}
\usepackage{graphicx,stackengine,trimclip}
\begin{document}
\stackinset{l}{20pt}{b}{40pt}{%
  \clipbox{20pt 40pt 15pt 15pt}{\includegraphics{example-grid-100x100bp.png}}%
}{%
  \includegraphics[decodearray={.3 .6 .3 .6 .3 .6}]{example-grid-100x100bp.jpg}%
}
\end{document}

decodearrayне будет работать с cmykцветовыми схемами и только с ограниченным числом форматов изображений (одним из которых является jpeg).

введите описание изображения здесь

Связанный контент