libtiff x64 visual studio 2017: выпуск компоновщика
Я пытался использовать пакет nuget для libtiff: => Package <=
Я написал небольшой кусочек кода, чтобы прочитать мультифрейм TIF-файл изображения.
vector<Mat> LibTiffReader::ReadMultiframeTiff(std::string FilePath)
{
vector<Mat> Result;
TIFF* tif = TIFFOpen(FilePath.c_str(), "r");
if (tif)
{
//Si le tif est ouvert, on itère sur ce qu'il y'a dedans...
do
{
Mat Image;
unsigned int width, height;
uint32* raster;
// On récupère la taille du tiff..
TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &width);
TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &height);
uint npixels = width*height; // get the total number of pixels
raster = (uint32*)_TIFFmalloc(npixels * sizeof(uint32)); // allocate temp memory (must use the tiff library malloc)
if (raster == NULL) // check the raster's memory was allocaed
{
TIFFClose(tif);
cerr << "Could not allocate memory for raster of TIFF image" << endl;
return vector<Mat>();
}
if (!TIFFReadRGBAImage(tif, width, height, raster, 0))
{
TIFFClose(tif);
cerr << "Could not read raster of TIFF image" << endl;
return vector<Mat>();
}
Image = Mat(width, height, CV_8UC3); // create a new matrix of w x h with 8 bits per channel and 3 channels (RGBA)
// itterate through all the pixels of the tif
for (uint x = 0; x < width; x++)
for (uint y = 0; y < height; y++)
{
uint32& TiffPixel = raster[y*width + x]; // read the current pixel of the TIF
Vec3b& pixel = Image.at<Vec3b>(Point(y, x)); // read the current pixel of the matrix
pixel[0] = TIFFGetB(TiffPixel); // Set the pixel values as BGR
pixel[1] = TIFFGetG(TiffPixel);
pixel[2] = TIFFGetR(TiffPixel);
}
_TIFFfree(raster);
Result.push_back(Image);
} while (TIFFReadDirectory(tif));
}
return Result;
}
Мне нужно использовать libtiff, потому что мне нужно кое-что сделать с exif-данными моего изображения, чего не позволяет мне OpenCV.
Проблема в том, что когда я хочу скомпилировать, у меня возникают ошибки компоновщика:
Error LNK2001 unresolved external symbol inflateInit_ SIA <Path>\tiff.lib(tif_zip.obj) 1
Error LNK2001 LNK2001 unresolved external symbol inflateInit_ SIA <Path>\tiff.lib(tif_pixarlog.obj) 1
Мой файл package.config выглядит так:
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="libtiff-msvc-x64" version="4.0.7.8808" targetFramework="native" />
</packages>
Когда я захожу в свойствах своего проекта, я не вижу никаких параметров пакетов. Я пытался добавить параметры компоновщика вручную к файлам.lib, но у меня те же проблемы.
1 ответ
Точно так же, как сказал @ReturnVoid, библиотека, загруженная с пакетом nuget, не была правильно скомпилирована для моей системы.
Решить проблему:
- Зайдите на индекс libtiff и скачайте последнюю версию.
Перейдите в каталог загрузки и используйте cmake для его генерации с помощью следующей команды:
cmake -G "Visual Studio 15 2017 Win64"
Как только это будет сделано, откройте проект с Visual Studio 2017
Постройте библиотеку Debug и Release (вы можете найти ее в подкаталоге libtiff).
Добавьте \libtiff в качестве включаемого каталога. Добавить \libtiff\Release как каталог линкера. Добавить tiff.lib в качестве связанной библиотеки. Добавить запрос предварительной сборки, чтобы скопировать tiff.dll и tiffxx.dll в выходной каталог.
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="libjpeg" version="9.0.1.4" targetFramework="native" />
<package id="libjpeg.redist" version="9.0.1.4" targetFramework="native" />
<package id="libtiff" version="4.0.6.2" targetFramework="native" />
<package id="libtiff.redist" version="4.0.6.2" targetFramework="native" />
<package id="libtiff-msvc14-x64" version="4.0.7.7799" targetFramework="native" />
<package id="zlib" version="1.2.8.8" targetFramework="native" />
<package id="zlib.v120.windesktop.msvcstl.dyn.rt-dyn" version="1.2.8.8" targetFramework="native" />
<package id="zlib.v140.windesktop.msvcstl.dyn.rt-dyn" version="1.2.8.8" targetFramework="native" />
</packages>
Возможно проблемы с зависимостью. Конфигурация моих пакетов nuget указана выше.