Magick ++ kann das Dateiformat nicht identifizierenC++

Programme in C++. Entwicklerforum
Anonymous
 Magick ++ kann das Dateiformat nicht identifizieren

Post by Anonymous »

Ich versuche derzeit, einen iTHumbnailProvider zu implementieren, um eine Miniaturinie für PSD -Dateien im Explorer zu rendern. Ich habe vor, Imagemagick zu verwenden, und es ist C ++ API (Magick ++), um dies zu tun, da ich diese LIB schon einmal verwendet habe. Alles ist gut, bis Imagemagick Dateien laden muss: Es stellt eine Ausnahme mit einer Nachricht auf, die kein Dekodus -Delegat für dieses Bildformat " @ error/konstitutiert". Dateiformate, da es nicht einmal den Namen in der Ausnahmemeldung geben kann.

Code: Select all

#include "pch.h"

#include "PSDThumbnailProvider.h"
#include "PSDReader.h"
#include 

...

bool g_magickInitialized = false;

PSDThumbnailProvider::PSDThumbnailProvider() {
...

if (!g_magickInitialized) {
char dllPath[MAX_PATH];
GetModuleFileNameA(g_hModule, dllPath, MAX_PATH);
// I'm not sure this is right, but it makes the exception popup have my dll's name
// on it, instead of "DllHost.exe"
Magick::InitializeMagick(dllPath);
g_magickInitialized = true;
}
}
...
psDreader.cpp

Code: Select all

#include "pch.h"

#include "PSDReader.h"
#include 

HRESULT getStreamLength(IStream* pstream, size_t* pLength) {
STATSTG stat;
HRESULT hr = pstream->Stat(&stat, STATFLAG_DEFAULT);
*pLength = stat.cbSize.QuadPart;

return hr;
}

HRESULT PSDReader::CreateThumbnailBitmap(
IStream* pstream,
UINT maxWidth, UINT maxHeigth,
HBITMAP* phbmp, WTS_ALPHATYPE* pdwAlpha)
{
// Get stream length
size_t streamLength;
HRESULT hr = getStreamLength(pstream, &streamLength);
if (FAILED(hr)) return hr;

// Read from stream until end
std::vector buffer(streamLength);
ULONG bytesRead = 0;
while (bytesRead < streamLength) {
ULONG chunk = 0;
HRESULT hr = pstream->Read(
buffer.data() + bytesRead,
streamLength - bytesRead,
&chunk);
if (FAILED(hr) || chunk == 0) break;
bytesRead += chunk;
}

if (bytesRead != streamLength) {
return E_FAIL; // Truncated is bad
}

// Load ImageMagick's Image from the buffer
Magick::Image magickImage;
Magick::Blob blob = Magick::Blob(buffer.data(), bytesRead);
try {
magickImage.read(blob);
// This does not throw an exception, but `magickImage.format()` doesn't work.
// `magickImage.columns()`, `magickImage.rows()` and `magickImage.thumbnail()` seem to work.
}
catch (Magick::Exception&) {
return E_FAIL;
}

{ // Debugging image loading
try {
Magick::Image magickImage;
magickImage.read("G:\\test\\test.jpeg");
MessageBoxA(NULL, "It works!", "Debug", MB_OK);
}
catch (Magick::Exception& ex) {
MessageBoxA(NULL, ex.what(), "Debug", MB_OK | MB_ICONERROR);
}
}
return S_OK;
}
ähnlicher Anmerkung, imagemagick ist auch hier mit einem ähnlichen Fehler psdhumbnailprovider. Fehler/pixel.c/exportimagepixel/2086 beim Laden von einem Magn :: Blob:

Code: Select all

const size_t actualWidth = magickImage.columns();
const size_t actualHeight = magickImage.rows();

std::vector pixels(actualWidth * actualHeight * 4);
try {
magickImage.write(0, 0, actualWidth, actualHeight, "BGRA", Magick::CharPixel, pixels.data());
MessageBoxW(NULL, L"It works!", L"Debug", MB_OK);
}
catch (Magick::Exception& ex) {
MessageBoxA(NULL, ex.what(), "Debug", MB_OK | MB_ICONERROR);
// Is throwing "unrecognized pixel map" and sometimes "memory allocation failed" or something like that
return E_FAIL;
}
< /code>
Ich habe eine C ++ - Konsolen -App erstellt, um besser zu debuggen, und sie bleibt auf dem Anruf read () stecken, wirft aber nichts aus, und die Ausgabekonsole auf Visual Studio zeigt keinen Fehler.  Wenn ich einen zufälligen Pfad einer Datei verwende, die nicht existiert, passiert das Gleiche.#include 
#include 

int main(int argc, char** argv)
{
Magick::InitializeMagick(*argv);
Magick::Image magickImage;

try {
magickImage.read("G:\\test\\test.jpg");
}
catch (std::exception &ex){
return E_FAIL;
}
return S_OK;
}
MAGICK Identifizierung -list -Format listet viele Dinge auf, einschließlich PSD und die gemeinsamen PNG, JPEG usw., Formate.

Code: Select all

Path: [built-in]

Name                  Value
-------------------------------------------------------------------------------
DELEGATES             bzlib cairo freetype gslib heic jng jp2 jpeg jxl lcms lqr lzma openexr pangocairo png ps raqm raw rsvg tiff webp xml zip zlib
FEATURES              Channel-masks(64-bit) Cipher DPC Modules OpenCL OpenMP(2.0)
MAGICK_TEMPORARY_PATH C:/Users/UCQ/AppData/Local/Temp
NAME                  ImageMagick
QuantumDepth          Q8

Path: C:\Program Files\ImageMagick-7.1.2-Q8\configure.xml

Name                  Value
-------------------------------------------------------------------------------
CC                    VS2022
CHANNEL_MASK_DEPTH    64
COPYRIGHT             Copyright (C) 1999 ImageMagick Studio LLC
CXX                   VS2022
DOCUMENTATION_PATH    unavailable
GIT_REVISION          83b6fc3:20250811
LIB_VERSION           0x712
LIB_VERSION_NUMBER    7,1,2,1
NAME                  ImageMagick
QuantumDepth          8
RELEASE_DATE          2025-08-12
TARGET_CPU            x64
TARGET_OS             Windows
VERSION               7.1.2
WEBSITE               https://imagemagick.org
Dependenzen.exe behauptet, dass meine DLL core_rl_magick ++ _. Ich habe versucht, aus der Quelle zu bauen, aber ich konnte es nicht bauen. Ich habe auch versucht, die DLL -Dateien von ImageMagicks Installationsordner auf meine .dlls zu kopieren und auf das Beste zu hoffen. Ich verwende Visual Studio 2022, mit welchem Magick -Verssion ebenfalls zusammengestellt worden sein sollen.>

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post