Что нового

[Script] RarJpeg (программа для соединения RAR и JPG файлов)

ynbIpb

Скриптер
Сообщения
399
Репутация
110
AutoIt: 3.3.0.0
Версия: 0.1
Категория: ...
Название: RarJpeg
Описание: Программка для создания РарДжипегов.
Rarjpeg — картинка, склеенная с RAR-архивом (JPEG with embedded RAR-file).
Принцип работы: Программы для просмотра изображений анализирую формат JPEG (и многие другие) с начала файла, конец игнорируют. Архиваторы напротив, определяют архив по наличию сигнатуры, которая может находиться где-то в середине файла (т.к. в начале файла может находиться SFX-модуль, который они обязаны проигнорировать, чтобы можно было проводить манипуляции с самораспаковывающимися архивами). За счёт этих двух факторов можно невозбранно слепить картинку и архив в один файл, который приобретёт функциональность обоих кусков.
Зачем это нужно? Возможность выложить контент, не являющийся картинками на ресурсы, где кроме картинок ничего выкладывать нельзя.
з.ы.
Благодарность NIKZZZZ с руборда за помошь в релизации чтения больших файлов.
Код:
Код:
; ---------------------------------------------------
; AutoIt Version: 3.3.0.0
; Author: ynbIpb
; Script name: RarJpeg v.0.1
; Script Function: Программа для создания Рарджипегов
; Что такое РарДжипег: http://lurkmore.ru/Rarjpeg
; ----------------------------------------------------
#NoTrayIcon
#include <GUIConstants.au3>
#include <EditConstants.au3> ; для стиля $ES_READONLY элемента Input
#include <StaticConstants.au3>; для стиля $SS_CENTER элемента Label
; объявляем переменные
$JpgFile = ""
$RarFile = ""
; рисуем ГУИ
$Form1 = GUICreate("RarJpeg", 152, 100)
; Input со стилем: только для чтения, выровнять по левому краю, автопрокрутка
$Input1 = GUICtrlCreateInput("", 4, 4, 121, 21, BitOR($ES_READONLY, $ES_LEFT, $ES_AUTOHSCROLL))
$Input2 = GUICtrlCreateInput("", 4, 30, 121, 21, BitOR($ES_READONLY, $ES_LEFT, $ES_AUTOHSCROLL))
$Button1 = GUICtrlCreateButton("...", 128, 4, 21, 21, 0)
$Button2 = GUICtrlCreateButton("...", 128, 30, 21, 21, 0)
$Button3 = GUICtrlCreateButton("Соединить Файлы", 4, 55, 145, 21, 0)
; Label со стилем: выровнять по центру
$Label1 = GUICtrlCreateLabel("Выберите файлы...", 4, 80, 144, 15, $SS_CENTER)
$Progress1 = GUICtrlCreateProgress(4, 80, 144, 15)
GUICtrlSetState($Progress1, $GUI_HIDE); Progress пока скрываем.
GUISetState(@SW_SHOW)

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Button1
			$JpgFile = FileOpenDialog("Выберите jpg файл..", @ScriptDir, "Images (*.jpg;*.jpeg)", 1)
			; отделяем от пути имя файла
			$JpgName = StringMid($JpgFile, StringInStr($JpgFile, "\", 0, -1) + 1)
			; и заносим его в Input
			GUICtrlSetData($Input1, $JpgName)
		Case $Button2
			$RarFile = FileOpenDialog("Выберите rar файл..", @ScriptDir, "Arhives (*.rar)", 1)
			$RarName = StringMid($RarFile, StringInStr($RarFile, "\", 0, -1) + 1)
			GUICtrlSetData($Input2, $RarName)
		Case $Button3
			joinfiles() ; пытаемся начать соединение файлов
	EndSwitch
WEnd

; дабы не захламлять основной цикл кодом, весь процесс склеивания вынесен в функцию
Func joinfiles()
	If $JpgFile = "" Then ; если не выбран 1 файл: выводим ошибку и возвращаемcя из функции
		GUICtrlSetData($Label1, "Ошибка: Нет *.jpg файла!")
		Return
	EndIf
	If $RarFile = "" Then ; если не выбран 2 файл: выводим ошибку и возвращаемcя из функции
		GUICtrlSetData($Label1, "Ошибка: Нет *.rar файла!")
		Return
	EndIf
	GUICtrlSetState($Label1, $GUI_HIDE); теперь скрываем Label, чтоб не мешал Progress'у
	GUICtrlSetState($Progress1, $GUI_SHOW); отображаем Progress
	; jpg файл копируем сразу, так как он мал и должен быть вначале
	FileCopy($JpgFile, @ScriptDir & "\Rarjpeg_" & $RarName & ".jpg")
	$orig_files_size = FileGetSize($JpgFile)
	$orig_files_size += FileGetSize($RarFile); считаем суммарный размер исходных файлов
	$file2 = FileOpen($RarFile, 16); открываем rar в бинарном режиме для чтения
	; выходной файл открываем в бинарном режиме на запись только в конец файла
	$file3 = FileOpen(@ScriptDir & "\Rarjpeg_" & $RarName & ".jpg", 17)
	While 1 ; цикл чтения\записи большого файла по кускам
		$Buf = FileRead($file2, 1024 * 1024) ; по 1 Mb в буфер
		If @error = -1 Then ExitLoop
		FileWrite($file3, $Buf)
		; проверяем размер выходного файла и высчитываем процент для Progress'а
		$new_file_size = FileGetSize(@ScriptDir & "\Rarjpeg_" & $RarName & ".jpg")
		$Percent = $new_file_size * 100 / $orig_files_size
		$Percent = Ceiling($Percent)
		GUICtrlSetData($Progress1, $Percent)
	WEnd
	FileClose($file2)
	FileClose($file3)
	GUICtrlSetState($Progress1, $GUI_HIDE)
	GUICtrlSetData($Label1, "Готово!")
	GUICtrlSetState($Label1, $GUI_SHOW)
EndFunc
Screenshot:
rarjpeg.jpg

Источник: ynbIpb
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
Re: (Script) RarJpeg

Мне нравится :smile: Правда еще не встречал сайты где кроме картинок ничего нельзя прикрепить. Полезная программа :smile:
 
Автор
ynbIpb

ynbIpb

Скриптер
Сообщения
399
Репутация
110
Re: (Script) RarJpeg

Я это создал специально для picasaweb.google.com
Там дают 1 гиг места под фотки и максимальный размер файла 20 mb
И хранится можно сказать вечно.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Re: (Script) RarJpeg

Чистый код. Хорошо сделал.

;)
 
Автор
ynbIpb

ynbIpb

Скриптер
Сообщения
399
Репутация
110
Re: (Script) RarJpeg

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

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Re: (Script) RarJpeg

ynbIpb сказал(а):
Спасибо, стараюсь всегда подробно коментировать код, чтоб самому легче вспоминать было и людям приятно.
То, что комментируешь это хорошо, но я имел в виду не это. Просто грамотно составлен код. Продолжай в том же духе.
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Re: (Script) RarJpeg

Программа полезная, стал активно ею пользоваться при публикации переводов к комиксам :smile:
 
V

VitAl2013

Гость
Re: [Script] RarJpeg

А вообще интересно... Можно слепить скажем скриншот программы с самой программой. Наглядно и всё в одном флаконе. А это не прикроют со временем какими-нить антивирусами? есть прогноз?
 
Автор
ynbIpb

ynbIpb

Скриптер
Сообщения
399
Репутация
110
Re: [Script] RarJpeg

с EXE файлами этот трюк не прокатит.
Вреда от этого нет, по этому антивирусникам на это пофиг.
 

Arei

Скриптер
Сообщения
938
Репутация
115
Re: [Script] RarJpeg

А что с помощью этого скрипта если его изменить соединить например 2 exe или другие файлы.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Re: [Script] RarJpeg

ynbIpb
Переименуй пожалуйста тему в соответствий с правилами.
 
Автор
ynbIpb

ynbIpb

Скриптер
Сообщения
399
Репутация
110
CreatoR, Тему переименовал.

Arei, Соединение с EXE несёт в себе уже совсем другой смысл и назначение. Абсолютно не из этой оперы. Просто в этом случае используется случайное стечение обстоятельств, которое позволяет использовать склеенные файлы без ущерба друг для друга.
Так что НЕТ!
 

IIuOHeP

Новичок
Сообщения
21
Репутация
2
Может я чего-то не понял... А как файлы разделить после слияния???? :scratch:
 

gsom

Новичок
Сообщения
11
Репутация
1
открываешь картинку винраром
???
профит
 
Автор
ynbIpb

ynbIpb

Скриптер
Сообщения
399
Репутация
110
IIuOHeP [?]
Может я чего-то не понял... А как файлы разделить после слияния?
В этом нет необходимости. Файл получается универсальный. Но если приспичит, то картинку просто пересохранить в любом редакторе. А архив извлечь и упаковать по новой.
 

IIuOHeP

Новичок
Сообщения
21
Репутация
2
Нашел в чём была загвоздка... !
Для слияния я использовал "Стандартную" картинку Windows 7 (Sample Pictures) после этого WinRar выдавал ошибку "Архив повреждён или имеет неизвестный формат"
При использовании "обычной" картинки всё работает :smile:
 

DarWiM

Продвинутый
Сообщения
527
Репутация
90
Хорошее наблюдение, отличная работа :laugh:
 

bav33

Новичок
Сообщения
1
Репутация
0
Хорошая программа, но я пользуюсь:
copy /b Pic.jpg + Data.rar SuperPic.jpg
или
type Pic.jpg Data.rar > SuperPic.jpg
 
Верх