Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Хочу все знать (http://forum.oszone.net/forumdisplay.php?f=23)
-   -   [решено] Наложение таблицы(сетки) на рисунок (http://forum.oszone.net/showthread.php?t=217431)

LilLoco 08-10-2011 12:18 1768601

Наложение таблицы(сетки) на рисунок
 
Здравствуйте. Есть рисунок 220*70 мм. Нужно поверх картинки нарисовать сетку (размер ячейки 10*10) с возможностью объединения этих ячеек. Подскажите какими средствами можно это осуществить. И как приблизительно. Заранее очень очень благодарен.

Сейчас сделал в Word, но может есть какой - либо еще вариант?

ferget 08-10-2011 12:50 1768617

в Corel Draw есть Graph Paper Tool

в photoshop можно с помощью направляющих и привязки

LilLoco 08-10-2011 12:58 1768620

ferget, А не могли бы вы поподробнее написать?) Совсем не знаком с работой с графикой :(

vadblm 08-10-2011 13:29 1768647

Не очень понятно, что значит
Цитата:

Цитата LilLoco
с возможностью объединения этих ячеек »

Но возможно сгодится скрипт для ImageMagick.

ferget 08-10-2011 13:33 1768650

создаете новый документ, в меню просмотр-> новая направляющая делаете 4 направляющих

две вертикальные 0см и 1см, две горизонтальные 0см и 1см

в меню просмотр-> Привязать к выбираете все привязки

карандашом обводите квадрат из направляющих, затем с помощью инструмента прямоугольная область обводите нарисованное карандашом

затем редактирование-> определить узор называете как нибудь

открываете ваш рисунок, делаете новый слой, жмете shift+backspace, в использовать: выбираете регулярный, в заказной узор, ваш узор и жмете OK

Iska 08-10-2011 14:44 1768683

vadblm, хорошая ссылка, спасибо.

LilLoco 08-10-2011 16:38 1768743

Всем спасибо, буду делать =)

Цитата:

Цитата vadblm
Не очень понятно, что значит »

ну нужно чтобы в некоторых местах, в сетке была ячейка, например, 30*10, т.е. объединить несколько столбцов в строке нужно. Как - то, вот так :)
Сам еще не понял, что нужно именно :)

vadblm 08-10-2011 16:52 1768748

Цитата:

Цитата LilLoco
объединить несколько столбцов в строке нужно. »

Какие столбцы, какие строки? Мы же о картинке говорим, а не о таблице. Какие в изображении столбцы и строки??? Может, вам нужно покромсать картинку на тайлы, которые в свою очередь использовать фоном для ячеек таблицы?
Цитата:

Цитата LilLoco
Сам еще не понял, что нужно именно »

Ну уж постарайтесь.

LilLoco 08-10-2011 17:15 1768759

Цитата:

Цитата vadblm
Какие столбцы, какие строки? Мы же о картинке говорим, а не о таблице »

Нужно поверх картинки, "сделать" таблицу( вот в ней то уже и есть столбцы и строки)
Как то вот так :

Сейчас я сделал это в Word. Но в нем немного сбит масштаб...

Цитата:

Цитата vadblm
Может, вам нужно покромсать картинку на тайлы, которые в свою очередь использовать фоном для ячеек таблицы? »

Этого хотелось бы избежать :)

Iska 08-10-2011 20:01 1768907

LilLoco, то есть, просто нарисовать поверх изображения сетку, так?

По каким принципам, как Вы определяете, какие именно «ячейки» будут «объединены»? Или Вы заранее этого не знаете, и планируете каждый раз, под каждое изображение, проделывать сие «ручками» (поскольку заранее сказать нельзя)?

LilLoco 08-10-2011 20:03 1768910

Iska, да нужно поверх просто наложить.
Расположение объединенных ячеек известно заранее.

Iska 09-10-2011 07:30 1769159

Цитата:

Цитата LilLoco
Iska, да нужно поверх просто наложить. »

LilLoco, для ручного метода объединения можно попробовать так:
читать дальше »
Код:

Option Explicit

Const psPixels = 1
Const psDisplayNoDialogs    = 3


Dim strDocument

Dim objPhotoshop
Dim objDocument
Dim objLayerSet

Dim lngPrevRulerUnits
Dim lngPrevDisplayDialogs

Dim i
Dim j
Dim lngStep


Set objPhotoshop = WScript.CreateObject("Photoshop.Application")
objPhotoshop.Visible = True

lngPrevRulerUnits = objPhotoshop.Preferences.RulerUnits
objPhotoshop.Preferences.RulerUnits = psPixels

lngPrevDisplayDialogs = objPhotoshop.DisplayDialogs
objPhotoshop.DisplayDialogs = psDisplayNoDialogs

If objPhotoshop.Documents.Count > 0 Then
        Set objDocument = objPhotoshop.ActiveDocument
Else
        strDocument = "E:\Песочница\0083\Sample.jpg"
       
        Set objDocument = objPhotoshop.Open(strDocument)
End If

Set objLayerSet = objDocument.LayerSets.Add
objLayerSet.Name = "Сетка"

' Шаг сетки в мм
lngStep = 100 * objDocument.Resolution / 25.4

For i = 0 To objDocument.Width Step lngStep
        For j = 0 To objDocument.Height Step lngStep
                With objDocument.ArtLayers.Add
                        .Move objLayerSet, 0
                End With
               
                DrawLine objPhotoshop, i, j, i + lngStep, j, 1
               
                With objDocument.ArtLayers.Add
                        .Move objLayerSet, 0
                End With
               
                DrawLine objPhotoshop, i, j, i, j + lngStep, 1
        Next
Next

objPhotoshop.Preferences.RulerUnits = lngPrevRulerUnits
objPhotoshop.DisplayDialogs        = lngPrevDisplayDialogs

Set objLayerSet  = Nothing
Set objDocument  = Nothing
Set objPhotoshop = Nothing

WScript.Quit 0
'=============================================================================

'=============================================================================
Sub DrawLine(objApp, x1, y1, x2, y2, width)
        Dim objAD_StartPoint
        Dim objAD_EndPoint
        Dim objAD_Line
        Dim objAD_Shape
       
       
        Set objAD_StartPoint = WScript.CreateObject("Photoshop.ActionDescriptor")
        With objAD_StartPoint
                .PutUnitDouble objApp.StringIDToTypeID("horizontal"), objApp.StringIDToTypeID("distanceUnit"), x1
                .PutUnitDouble objApp.StringIDToTypeID("vertical"),  objApp.StringIDToTypeID("distanceUnit"), y1
        End With
       
        Set objAD_EndPoint  = WScript.CreateObject("Photoshop.ActionDescriptor")
        With objAD_EndPoint
                .PutUnitDouble  objApp.StringIDToTypeID("horizontal"), objApp.StringIDToTypeID("distanceUnit"), x2
                .PutUnitDouble  objApp.StringIDToTypeID("vertical"),  objApp.StringIDToTypeID("distanceUnit"), y2
        End With
       
        Set objAD_Line      = WScript.CreateObject("Photoshop.ActionDescriptor")
        With objAD_Line
                .PutObject      objApp.StringIDToTypeID("start"), objApp.StringIDToTypeID("paint"),      objAD_StartPoint
                .PutObject      objApp.StringIDToTypeID("end"),  objApp.StringIDToTypeID("paint"),      objAD_EndPoint
                .PutUnitDouble  objApp.StringIDToTypeID("width"), objApp.StringIDToTypeID("pixelsUnit"), width
        End With
       
        Set objAD_Shape      = WScript.CreateObject("Photoshop.ActionDescriptor")
        With objAD_Shape
                .PutObject      objApp.StringIDToTypeID("shape"), objApp.StringIDToTypeID("lineClass"), objAD_Line
                .PutBoolean      objApp.StringIDToTypeID("antiAlias"), True
        End With
       
        objApp.ExecuteAction objApp.StringIDToTypeID("draw"), objAD_Shape, psDisplayNoDialogs
       
        Set objAD_Shape      = Nothing
        Set objAD_Line      = Nothing
        Set objAD_EndPoint  = Nothing
        Set objAD_StartPoint = Nothing
End Sub
'=============================================================================


* работа ведётся с открытым в Photoshop'е документом, при отсутствии такового — с указанным;
* сетка рисуется текущим цветом (просто установите потребный цвет перед запуском скрипта) из горизонтальных и вертикальных линий — рёбер квадратов, каждая линия в отдельном слое (дабы можно было просто удалить слой с линией для объединения двух квадратов);
* сетка рисуется от координаты 0,0 вправо-вниз с шагом:
Код:

' Шаг сетки в 100 мм
lngStep = 100 * objDocument.Resolution / 25.4

* по окончании отрисовки не делается никаких действий по сохранению документа, закрытию Photoshop'а.

Я постарался максимально упростить пример. Код проверялся под Photoshop из CS 2 (другого под рукой не нашлось). Вполне возможно, что в новых версиях что-то поменялось и отвалится, что-то можно сделать проще и т.п.
Цитата:

Цитата LilLoco
Расположение объединенных ячеек известно заранее. »

Тогда можно попробовать обойтись более простыми средствами (вопрос только в определении соотношения между мм и пикселями в тех форматах, которые не содержат информацию о dpi).

Как думаете указывать, какие квадраты будут являться объединёнными (или отсутствующие рёбра)?

LilLoco 09-10-2011 11:16 1769234

Iska, Спасибо большое!

Цитата:

Цитата Iska
Как думаете указывать, какие квадраты будут являться объединёнными (или отсутствующие рёбра)? »

Не совсем понял вопроса :(

Цитата:

Цитата Iska
lngStep = 100 * objDocument.Resolution / 25.4 »

Здесь 25.4 - это, я так понимаю, коэффициент для перевода пиксели в миллиметры? А всегда ли он такой? - Просто ставлю 10 мм шаг, отрисовывается явно ширина не в 10 мм.

Iska 09-10-2011 16:16 1769446

Цитата:

Цитата LilLoco
Не совсем понял вопроса »

Я интересуюсь: ежели Вы заранее знаете, какие «ячейки» будут объединёнными — надо придумать какой-то способ указания этих «ячеек» программе. Тогда можно будет выполнять построение сетки полностью автоматизированно.

Цитата:

Цитата LilLoco
Здесь 25.4 - это, я так понимаю, коэффициент для перевода пиксели в миллиметры? »

Нет. 25.4 — это количество миллиметров в одном дюйме.
Цитата:

Цитата LilLoco
А всегда ли он такой? »

Ага.
Цитата:

Цитата LilLoco
Просто ставлю 10 мм шаг, отрисовывается явно ширина не в 10 мм. »

Мы берём заданный шаг, пусть 10 мм. Умножаем его на коэффициент dpi документа (если он не предусмотрен в формате документа, то Photoshop предполагает 72 dpi для документов для печати). Затем делим на 25.4 мм/дюйм. При печати изображения шаг сетки будет составлять 10 мм. То есть, меняя dpi открытого в Photoshop'е документа — Вы управляете физическим размером документа на печати.

LilLoco 10-10-2011 07:37 1769826

Цитата:

Цитата Iska
надо придумать какой-то способ указания этих «ячеек» программе. Тогда можно будет выполнять построение сетки полностью автоматизированно »

Я думаю можно просто поудалять слои. Это единичный случай, думаю, можно не автоматизировать.

Iska, Спасибо Вам огромное за помощь и разъяснения!

Iska 10-10-2011 16:39 1770180

Цитата:

Цитата LilLoco
Я думаю можно просто поудалять слои. Это единичный случай, думаю, можно не автоматизировать. »

Спасибо, ясно.

LilLoco 10-10-2011 22:04 1770446

Цитата:

Цитата Iska
Спасибо, ясно. »

Это Вам спасибо ;-)


Время: 00:33.

Время: 00:33.
© OSzone.net 2001-