Что нового

Склеить 3 картинки в 1 параллельную.

Arei

Скриптер
Сообщения
938
Репутация
115
Здравствуйте, подскажите как склеить 3 jpg изображения, что бы на выходе получился 1?

x_image%20%281%29.jpg

x_image.jpg

x_image%20%282%29.jpg



это 3 отдельных фотографии, надо сделать 1 параллельную.
 

SECTOR

Продвинутый
Сообщения
399
Репутация
59
Как-то так? :scratch:

Код:
#include <GDIPlus.au3>

Dim $aImgs[3] = ["x_image (1).jpg","x_image.jpg","x_image (2).jpg"]

_GDIPlus_Startup()

Dim $ahImage[UBound($aImgs)]

For $i = 0 To UBound($aImgs)-1
	$ahImage[$i] = _GDIPlus_ImageLoadFromFile($aImgs[$i])
Next

$iWidth = _GDIPlus_ImageGetWidth($ahImage[0])
$iHeight = _GDIPlus_ImageGetHeight($ahImage[0])

$hNewBitmap = _WinAPI_CreateBitmap($iWidth*UBound($aImgs),$iHeight)
$hNewBitmap2 = _GDIPlus_BitmapCreateFromHBITMAP($hNewBitmap)
$hGraphic = _GDIPlus_ImageGetGraphicsContext($hNewBitmap2)

For $i = 0 To UBound($ahImage)-1
	_GDIPlus_GraphicsDrawImage($hGraphic,$ahImage[$i],$i*$iWidth,0)
	_GDIPlus_ImageDispose($ahImage[$i])
Next

_GDIPlus_ImageSaveToFile($hNewBitmap2,"NewFile.jpg")
_GDIPlus_GraphicsDispose($hGraphic)
_WinAPI_CloseHandle($hNewBitmap)
_GDIPlus_ImageDispose($hNewBitmap2)

_GDIPlus_Shutdown()

Exit
 
Автор
A

Arei

Скриптер
Сообщения
938
Репутация
115
Да шикарный вариант, спасибо.
 

joiner

Модератор
Локальный модератор
Сообщения
3,573
Репутация
634
а можно без потери в цвете?
 

joiner

Модератор
Локальный модератор
Сообщения
3,573
Репутация
634
в смысле "зачем"? хочу склеить пару цветных фоток или картинок. сделать этакую фотопанораму.
предложенным кодом получается черно-белое и уж очень темное изображение.
 

SECTOR

Продвинутый
Сообщения
399
Репутация
59
joiner, я, честно говоря, не знаю, почему так происходит :whistle:
 

joiner

Модератор
Локальный модератор
Сообщения
3,573
Репутация
634
Arei
немногословный мой друг, ты чуть подробнее , пожалуйста, говори. что "странно"? у тебя получается по-другому?
SECTOR, голубчик, у тебя получается склеить в цветную панораму?
ребята, мне что, приехать к вам и поставить пузырь, чтобы вы разговорчивее стали? ))))
 
Автор
A

Arei

Скриптер
Сообщения
938
Репутация
115
OffTopic:
joiner
Я тебя не знаю и думаю не логично говорить про дружбу,мой ответ был написан SECTOR и ты никаким боком тут не причём.
 

joiner

Модератор
Локальный модератор
Сообщения
3,573
Репутация
634
OffTopic:
Arei
не воспринимай все буквально. а твой ответ можно было отнести к кому угодно. и все потому, что ты не многословен. ну да ладно . сказали и забыли. ;)


ну так все-таки, как склеить без потери в цвете?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
joiner сказал(а):
ну так все-таки, как склеить без потери в цвете?

Замени

Код:
$hNewBitmap = _WinAPI_CreateBitmap($iWidth * UBound($aImgs), $iHeight)


на

Код:
$hNewBitmap = _WinAPI_CreateBitmap($iWidth * UBound($aImgs), $iHeight, 1, 32)
 

joiner

Модератор
Локальный модератор
Сообщения
3,573
Репутация
634
получилось вот что
 

SECTOR

Продвинутый
Сообщения
399
Репутация
59
joiner, ну просто я писал код конкретно для тех картинок) покажи код который сотворил это)

Я без проблем склеил 2 рисунка одинакового размера

Только вот заменил
Код:
_GDIPlus_GraphicsDrawImage($hGraphic,$ahImage[$i],$i*$iWidth,0)

на
Код:
_GDIPlus_GraphicsDrawImageRect($hGraphic,$ahImage[$i],$i*$iWidth,0,$iWidth,$iHeight)
 

joiner

Модератор
Локальный модератор
Сообщения
3,573
Репутация
634
с этим кодом получается в цвете
Код:
#include <GDIPlus.au3>

Dim $aImgs[2] = ["foto.jpg","foto1.jpg"]

_GDIPlus_Startup()

Dim $ahImage[UBound($aImgs)]

For $i = 0 To UBound($aImgs)-1
    $ahImage[$i] = _GDIPlus_ImageLoadFromFile($aImgs[$i])
Next

$iWidth = _GDIPlus_ImageGetWidth($ahImage[0])
$iHeight = _GDIPlus_ImageGetHeight($ahImage[0])

$hNewBitmap = _WinAPI_CreateBitmap($iWidth * UBound($aImgs), $iHeight, 1, 32)
$hNewBitmap2 = _GDIPlus_BitmapCreateFromHBITMAP($hNewBitmap)
$hGraphic = _GDIPlus_ImageGetGraphicsContext($hNewBitmap2)

For $i = 0 To UBound($ahImage)-1
    _GDIPlus_GraphicsDrawImageRect($hGraphic,$ahImage[$i],$i*$iWidth,0,$iWidth,$iHeight)
    _GDIPlus_ImageDispose($ahImage[$i])
Next

_GDIPlus_ImageSaveToFile($hNewBitmap2,"NewFile.jpg")
_GDIPlus_GraphicsDispose($hGraphic)
_WinAPI_CloseHandle($hNewBitmap)
_GDIPlus_ImageDispose($hNewBitmap2)

_GDIPlus_Shutdown()

Exit
ну и как надо
только больше двух фото не склеивает
 

joiner

Модератор
Локальный модератор
Сообщения
3,573
Репутация
634
SECTOR
я клеил фото с разрешением 4000*3000. может дело в этом?
хотя изменение разрешения результата не дает
все, нашел. ошибка была у меня.
вобщем, скрипт в предыдущем моем посте клеит как надо.
 

joiner

Модератор
Локальный модератор
Сообщения
3,573
Репутация
634
так как тема не отмечена решенной, то внесу еще пять копеек.
в скрипте используется
Код:
fileopendialog

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

Код:
#include <GDIPlus.au3>
#include <array.au3>
Opt("MustDeclareVars", 1)
Global $message, $var, $var_string, $path, $replac, $result, $iWidth, $iHeight, $hNewBitmap, $hNewBitmap2, $hGraphic
$message = "Удерживайте клавиши Ctrl или Shift, чтобы выбрать несколько файлов."
$var = FileOpenDialog($message, '', '(*.jpg;*.bmp;*.png)', 1 + 4)
If @error Then
	MsgBox(4096, "", "Не выбрано ни одного файла")
Else
	$var_string = StringReplace($var, "|", '\', 1)
	$path = _PathSplitByRegExp($var_string)
	$replac = StringReplace($var_string, '|', ',' & $path[2] & '\')
	$result = StringSplit($replac, ',')
	_ArrayDelete($result, 0)
	_foto_join()
EndIf

Func _PathSplitByRegExp($sPath)
	If $sPath = "" Or (StringInStr($sPath, "\") And StringInStr($sPath, "/")) Then Return SetError(1, 0, -1)
	Local $aRetArray[8], $pDelim = ""
	If StringRegExp($sPath, '^(?i)([A-Z]:|\\)(\\[^\\]+)+$') Then $pDelim = "\"
	If StringRegExp($sPath, '(?i)(^.*:/)(/[^/]+)+$') Then $pDelim = "//"
	If $pDelim = "" Then $pDelim = "/"
	If Not StringInStr($sPath, $pDelim) Then Return $sPath
	If $pDelim = "\" Then $pDelim &= "\"
	$aRetArray[0] = $sPath ;Full path
	$aRetArray[1] = StringRegExpReplace($sPath, $pDelim & '.*', $pDelim) ;Drive letter
	$aRetArray[2] = StringRegExpReplace($sPath, $pDelim & '[^' & $pDelim & ']*$', '') ;Path without FileName and extension
	$aRetArray[3] = StringRegExpReplace($sPath, '\.[^.]*$', '') ;Full path without File Extension
	$aRetArray[4] = StringRegExpReplace($sPath, '(?i)([A-Z]:' & $pDelim & ')', '') ;Full path without drive letter
	$aRetArray[5] = StringRegExpReplace($sPath, '^.*' & $pDelim, '') ;FileName and extension
	$aRetArray[6] = StringRegExpReplace($sPath, '.*' & $pDelim & '|\.[^.]*$', '') ;Just Filename
	$aRetArray[7] = StringRegExpReplace($sPath, '^.*\.', '') ;Just Extension of a file
	Return $aRetArray
EndFunc   ;==>_PathSplitByRegExp

Func _foto_join()
	_GDIPlus_Startup()
	Dim $ahImage[UBound($result)]
	For $i = 0 To UBound($result) - 1
		$ahImage[$i] = _GDIPlus_ImageLoadFromFile($result[$i])
	Next
	For $i = 0 To UBound($ahImage) - 1
		$iWidth = _GDIPlus_ImageGetWidth($ahImage[$i])
		$iHeight = _GDIPlus_ImageGetHeight($ahImage[$i])
	Next
	$hNewBitmap = _WinAPI_CreateBitmap($iWidth * UBound($result), $iHeight, 1, 32)
	$hNewBitmap2 = _GDIPlus_BitmapCreateFromHBITMAP($hNewBitmap)
	$hGraphic = _GDIPlus_ImageGetGraphicsContext($hNewBitmap2)
	For $i = 0 To UBound($ahImage) - 1
		_GDIPlus_GraphicsDrawImageRect($hGraphic, $ahImage[$i], $i * $iWidth, 0, $iWidth, $iHeight)
		_GDIPlus_ImageDispose($ahImage[$i])
	Next
	_GDIPlus_ImageSaveToFile($hNewBitmap2, "NewFile.jpg")
	_GDIPlus_GraphicsDispose($hGraphic)
	_WinAPI_CloseHandle($hNewBitmap)
	_GDIPlus_ImageDispose($hNewBitmap2)
	_GDIPlus_Shutdown()
	Exit
EndFunc   ;==>_foto_join
 

DarWiM

Продвинутый
Сообщения
527
Репутация
90
joiner
как я понял скрипт сжимает все картинки до минимального разрешения. а как сделать, чтоб небыло потери в пропорциях? :smile:
 
Верх