Имя пользователя:
Пароль:
 | Правила  

Компьютерный форум OSzone.net » Компьютеры + Интернет » Хочу все знать » [решено] Наложение таблицы(сетки) на рисунок

Ответить
Настройки темы
[решено] Наложение таблицы(сетки) на рисунок

В Поисках Истины


Сообщения: 802
Благодарности: 135


Конфигурация

Профиль | Отправить PM | Цитировать


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

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

-------
foreach(short w in new short[] {73,3,79,83,90,79,78,69}){
Console.Write((char)w);
}


Отправлено: 12:18, 08-10-2011

 

В Поисках Истины


Сообщения: 802
Благодарности: 135

Профиль | Отправить PM | Цитировать


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

-------
foreach(short w in new short[] {73,3,79,83,90,79,78,69}){
Console.Write((char)w);
}


Отправлено: 20:03, 08-10-2011 | #11



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

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Сообщения: 27449
Благодарности: 8088

Профиль | Отправить PM | Цитировать


Цитата 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).

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

Отправлено: 07:30, 09-10-2011 | #12


В Поисках Истины


Сообщения: 802
Благодарности: 135

Профиль | Отправить PM | Цитировать


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

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

Цитата Iska:
lngStep = 100 * objDocument.Resolution / 25.4 »
Здесь 25.4 - это, я так понимаю, коэффициент для перевода пиксели в миллиметры? А всегда ли он такой? - Просто ставлю 10 мм шаг, отрисовывается явно ширина не в 10 мм.

-------
foreach(short w in new short[] {73,3,79,83,90,79,78,69}){
Console.Write((char)w);
}


Последний раз редактировалось LilLoco, 09-10-2011 в 12:35.


Отправлено: 11:16, 09-10-2011 | #13


Ветеран


Сообщения: 27449
Благодарности: 8088

Профиль | Отправить PM | Цитировать


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

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

Отправлено: 16:16, 09-10-2011 | #14


В Поисках Истины


Сообщения: 802
Благодарности: 135

Профиль | Отправить PM | Цитировать


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

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

-------
foreach(short w in new short[] {73,3,79,83,90,79,78,69}){
Console.Write((char)w);
}


Отправлено: 07:37, 10-10-2011 | #15


Ветеран


Сообщения: 27449
Благодарности: 8088

Профиль | Отправить PM | Цитировать


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

Отправлено: 16:39, 10-10-2011 | #16


В Поисках Истины


Сообщения: 802
Благодарности: 135

Профиль | Отправить PM | Цитировать


Цитата Iska:
Спасибо, ясно. »
Это Вам спасибо ;-)

-------
foreach(short w in new short[] {73,3,79,83,90,79,78,69}){
Console.Write((char)w);
}


Отправлено: 22:04, 10-10-2011 | #17



Компьютерный форум OSzone.net » Компьютеры + Интернет » Хочу все знать » [решено] Наложение таблицы(сетки) на рисунок

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
наложение текста на видео shmond Видео и аудио: обработка и кодирование 17 22-04-2012 21:35
MSFT SQL Server - создание таблицы точнее проблемма с созданием таблицы GAROD Программирование и базы данных 4 02-12-2010 00:58
наложение текста на видео alexra Видео и аудио: обработка и кодирование 10 22-01-2010 13:49
[решено] Поздноватое наложение текстур. DIDIDIDIMA Видеокарты 4 10-01-2009 18:44
Наложение DACL на floppy usverrr Программирование и базы данных 2 19-08-2002 07:16




 
Переход