Что нового

Кто может скомпилировать Dll?

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Кто может скомпилировать dll (с++)?
Нужно собрать phash.dll

Я собирал через MinGW, ничего сложного, делал первый раз. Собралось без проблем. Только библиотека не может запустится без libgcc_s_dw2-1.dll и libstdc++-6.dll, что не очень хорошо.

Собрать нужно с опцией #define HAVE_IMAGE_HASH
И еще нужно добавить нативную поддержку форматов png, jpeg
png (#define cimg_use_png), jpeg (#define cimg_use_jpeg)

На выходе нужно получить единичный файл phash.dll
 
Автор
inververs

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Есть код для проверки. Но в нем я использую вынужденное преобразование в BMP.
Показывает на сколько похожи изображения.
Код:
#include <GDIPlus.au3>
#include <ScreenCapture.au3>

_GDIPlus_Startup()
$file_1 = '11.jpg'
$file_2 = '12.jpg'

$result = CC($file_1, $file_2)
MsgBox(0, 'Результат', 'Изображения похожи на: ' & Round($result * 100, 5) & '%')

_GDIPlus_Shutdown()


Func CC($file_1, $file_2)
	Local $file_out_1 = _convert_to_bmp($file_1, 'out_1.bmp')
	Local $file_out_2 = _convert_to_bmp($file_2, 'out_2.bmp')

	Local $digest_1 = ph_image_digest($file_out_1)
	Local $digest_2 = ph_image_digest($file_out_2)

	Local $result = ph_crosscorr($digest_1, $digest_2, 0.85)
	Return SetError(@error, @extended, $result)
EndFunc   ;==>CC

Func _convert_to_bmp($file, $file_out = 'out.bmp')
	Local $hImage = _GDIPlus_ImageLoadFromFile($file)
	Local $hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage, 0xFFFFFFFF)
	_ScreenCapture_SaveImage($file_out, $hBitmap)
	_GDIPlus_ImageDispose($hImage)
	Return $file_out
EndFunc   ;==>_convert_to_bmp


Func ph_image_digest($file, $sigma = 1.0, $gamma = 1.0, $N = 180)
;~ int ph_image_digest(const char *file, double sigma, double gamma, Digest &digest,int N=180);
;~ /*! /brief Digest info
;~  */
;~ typedef unsigned char uint8_t;
;~ typedef struct ph_digest {
;~     char *id;                   //hash id
;~     uint8_t *coeffs;            //the head of the digest integer coefficient array
;~     int size;                   //the size of the coeff array
;~ } Digest;
	Local $Digest = DllStructCreate('CHAR id; UINT coeffs; INT size')
	Local $aResult = DllCall("pHash.dll", "int:cdecl", "ph_image_digest", 'str', $file, 'double', $sigma, 'double', $gamma, 'STRUCT*', $Digest, 'int', $N)
	If @error Then Return SetError(@error, @extended, "")
	Return $Digest
EndFunc   ;==>ph_image_digest

Func ph_crosscorr($DigestX, $DigestY, $threshold = 0.9)
;~ To compare two radial hashes, a peak of cross correlation is determined between two hashes:
;~ The peak of cross correlation between the two vectors is returned in the pcc parameter.
;~ 	int ph_crosscorr(Digest &x, Digest &y, double &pcc, double threshold=0.90);
;~ 	   pcc = max;
;~     if (pcc > threshold) ;pcc > threshold
;~         result = 1;
	Local $aResult = DllCall("pHash.dll", "int:cdecl", "ph_crosscorr", 'STRUCT*', $DigestX, 'STRUCT*', $DigestY, 'double*', 0, 'double', $threshold)
	If @error Then Return SetError(@error, @extended, "")
	Return SetError(0, $aResult[0] = 1, $aResult[3])
EndFunc   ;==>ph_crosscorr





Добавлено:
Сообщение автоматически объединено:

Пересобрал через TDM-GCC

Избавился от зависимостей libgcc_s_dw2-1.dll и libstdc++-6.dll собрав с опциями -static-libgcc -static-libstdc++

В начале pHash.h прописал
#define HAVE_IMAGE_HASH
#define cimg_OS 2
#define cimg_verbosity 0
#define cimg_use_png
#define cimg_use_jpeg

Собрал с опциями:

C:\TDM-GCC-32\bin\g++.exe -c *.cpp
C:\TDM-GCC-32\bin\g++.exe -static-libgcc -static-libstdc++ -shared pHash.o -o pHash.dll -L C:\pHash-0.9.4 libpng.lib libjpeg

Уже легче. PNG и JPEG файлы начал принимать. Но только если возле скрипта лежат dll:
zlib1.dll
libpng12.dll
jpeg62.dll

Но хочется, если это возможно, без этих файлов. Как их включить в pHash.dll? Я так понимаю нужна статическая линковка и какие то опции компилятора. Но могу ошибаться.
 
M

max1300

Гость
Когда вы пишите Dll там должен быть компилятор в редакторе кода или рядом с редактором кода
 
Автор
inververs

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
max1300
Автор кода не я. Код доступен в исходниках.
 
Верх