Animated gifs are working now
This commit is contained in:
108
src/app.cpp
108
src/app.cpp
@@ -469,57 +469,22 @@ void App::sendImage() {
|
||||
|
||||
void App::imageUploaded(Wt::WFileUpload *fileWidget, std::shared_ptr<Magick::Blob> localImage, Wt::WImage *image, Wt::WPushButton *okButton) {
|
||||
try {
|
||||
const std::string uploadedFile = fileWidget->spoolFileName();
|
||||
std::list<Magick::Image> originalImages;
|
||||
Magick::readImages(&originalImages, fileWidget->spoolFileName());
|
||||
std::list<Magick::Image> previewList;
|
||||
std::list<Magick::Image> localList;
|
||||
|
||||
// Maximale Größen für Vorschau und lokale Liste festlegen
|
||||
int maxPreviewWidth = 100;
|
||||
int maxPreviewHeight = 100;
|
||||
int maxLocalWidth = 500;
|
||||
int maxLocalHeight = 500;
|
||||
|
||||
// Originalgröße des ersten Bildes erhalten
|
||||
int originalWidth = originalImages.front().columns();
|
||||
int originalHeight = originalImages.front().rows();
|
||||
|
||||
// Vorschau- und lokale Größe berechnen
|
||||
int previewWidth = std::min(originalWidth, maxPreviewWidth);
|
||||
int previewHeight = std::min(originalHeight, maxPreviewHeight);
|
||||
int localWidth = std::min(originalWidth, maxLocalWidth);
|
||||
int localHeight = std::min(originalHeight, maxLocalHeight);
|
||||
|
||||
// Größenänderung für alle Frames durchführen
|
||||
for (const auto& img : originalImages) {
|
||||
// Größenänderung nur durchführen, wenn das Bild größer als die maximalen Größen ist
|
||||
if (originalWidth > maxPreviewWidth || originalHeight > maxPreviewHeight) {
|
||||
Magick::Image resizedPreview = img;
|
||||
resizedPreview.resize(Magick::Geometry(previewWidth, previewHeight));
|
||||
previewList.push_back(resizedPreview);
|
||||
} else {
|
||||
previewList.push_back(img); // Originalgröße beibehalten
|
||||
}
|
||||
|
||||
if (originalWidth > maxLocalWidth || originalHeight > maxLocalHeight) {
|
||||
Magick::Image resizedLocal = img;
|
||||
resizedLocal.resize(Magick::Geometry(localWidth, localHeight));
|
||||
localList.push_back(resizedLocal);
|
||||
} else {
|
||||
localList.push_back(img); // Originalgröße beibehalten
|
||||
}
|
||||
}
|
||||
|
||||
Magick::Blob resizedBlob;
|
||||
Magick::writeImages(previewList.begin(), previewList.end(), &resizedBlob);
|
||||
Magick::writeImages(localList.begin(), localList.end(), &(*localImage));
|
||||
auto resizedBase64 = resizedBlob.base64();
|
||||
auto resizedImageString = Wt::Utils::base64Decode(resizedBase64);
|
||||
std::string imageFormat = previewList.front().magick();
|
||||
auto imageResource = std::make_shared<Wt::WMemoryResource>(
|
||||
"image/" + imageFormat,
|
||||
std::vector<unsigned char>(resizedImageString.begin(), resizedImageString.end()));
|
||||
image->setImageLink(Wt::WLink(imageResource));
|
||||
Magick::readImages(&originalImages, uploadedFile);
|
||||
std::list<Magick::Image> resizedForLocalImage;
|
||||
std::list<Magick::Image> resizedForDisplayImage;
|
||||
resizedForLocalImage = resizeImages(originalImages, 500, 500);
|
||||
resizedForDisplayImage = resizeImages(originalImages, 100, 100);
|
||||
std::string imageType = originalImages.front().magick();
|
||||
std::string mimeType = "image/" + imageType;
|
||||
Magick::writeImages(resizedForLocalImage.begin(), resizedForLocalImage.end(), localImage.get(), true);
|
||||
Magick::Blob displayBlob;
|
||||
Magick::writeImages(resizedForDisplayImage.begin(), resizedForDisplayImage.end(), &displayBlob, true);
|
||||
auto memoryResource = std::make_shared<Wt::WMemoryResource>(mimeType);
|
||||
memoryResource->setData(static_cast<const unsigned char*>(displayBlob.data()), displayBlob.length());
|
||||
image->setImageLink(Wt::WLink(memoryResource));
|
||||
image->setAlternateText("Hochgeladenes und verarbeitetes Bild");
|
||||
okButton->setEnabled(true);
|
||||
triggerUpdate();
|
||||
} catch (const std::exception& e) {
|
||||
@@ -527,16 +492,19 @@ void App::imageUploaded(Wt::WFileUpload *fileWidget, std::shared_ptr<Magick::Blo
|
||||
}
|
||||
}
|
||||
|
||||
Magick::Image App::scaleImage(const Magick::Image& originalImage, int maxSize) const {
|
||||
int scale = 100;
|
||||
int maxDimension = std::max(originalImage.size().width(), originalImage.size().height());
|
||||
if (maxDimension > maxSize) {
|
||||
scale = (maxSize * 100) / maxDimension;
|
||||
std::list<Magick::Image> App::resizeImages(std::list<Magick::Image> &images, int maxWidth, int maxHeight) {
|
||||
std::list<Magick::Image> resizedImages;
|
||||
for (auto& img : images) {
|
||||
Magick::Geometry newSize = img.size();
|
||||
newSize.aspect(true);
|
||||
if (newSize.width() > maxWidth || newSize.height() > maxHeight) {
|
||||
newSize.width(maxWidth);
|
||||
newSize.height(maxHeight);
|
||||
img.resize(newSize);
|
||||
}
|
||||
resizedImages.push_back(img);
|
||||
}
|
||||
scale = (scale < 100) ? scale : 100;
|
||||
Magick::Image scaledImage(originalImage);
|
||||
scaledImage.scale(Magick::Geometry(originalImage.size().width() * scale / 100, originalImage.size().height() * scale / 100));
|
||||
return scaledImage;
|
||||
return resizedImages;
|
||||
}
|
||||
|
||||
Wt::WContainerWidget* App::createSmileyButton(Wt::WHBoxLayout* inputLayout, Wt::WLineEdit* inputLine, std::shared_ptr<int> cursorPosition) {
|
||||
@@ -696,30 +664,16 @@ void App::createImprintContainer(Wt::WVBoxLayout *containerLayout) {
|
||||
|
||||
Wt::WWebWidget* App::createImageElement(Wt::Json::Object& line, const std::string& writer, Wt::WContainerWidget* outputContainer, std::string id) {
|
||||
Wt::Json::Object imageDescription = line["image"];
|
||||
std::cout << __LINE__ << std::endl;
|
||||
auto imageLineItem = outputContainer->addNew<Wt::WContainerWidget>();
|
||||
std::cout << __LINE__ << std::endl;
|
||||
auto outputText = Wt::WString("<b>{1}:</b> ").arg(writer);
|
||||
std::cout << __LINE__ << std::endl;
|
||||
imageLineItem->addNew<Wt::WText>(outputText)->setStyleClass("output-line");
|
||||
std::cout << __LINE__ << std::endl;
|
||||
auto image = imageLineItem->addNew<Wt::WImage>();
|
||||
std::cout << __LINE__ << std::endl;
|
||||
std::string base64Data = (std::string)imageDescription["imageblobbase64"];
|
||||
std::string decodedData = Wt::Utils::base64Decode(base64Data); // Decode Base64 data
|
||||
Magick::Blob imageBlob(decodedData.data(), decodedData.size());
|
||||
Magick::Image magickImage;
|
||||
magickImage.read(imageBlob);
|
||||
std::string imageFormat = magickImage.magick();
|
||||
std::cout << __LINE__ << std::endl;
|
||||
std::cout << imageFormat << std::endl;
|
||||
Magick::Blob blob;
|
||||
magickImage.write(&blob);
|
||||
auto resizedBase64 = blob.base64();
|
||||
auto resizedImageString = Wt::Utils::base64Decode(resizedBase64);
|
||||
std::string decodedData = Wt::Utils::base64Decode(base64Data);
|
||||
std::string imageType = imageDescription["type"].toString(); // Lese den Bildtyp
|
||||
auto imageResource = std::make_shared<Wt::WMemoryResource>(
|
||||
"image/" + imageFormat,
|
||||
std::vector<unsigned char>(resizedImageString.begin(), resizedImageString.end())); // Verwenden Sie den direkt decodierten Inhalt
|
||||
"image/" + imageType,
|
||||
std::vector<unsigned char>(decodedData.begin(), decodedData.end()));
|
||||
std::cout << __LINE__ << std::endl;
|
||||
image->setImageLink(Wt::WLink(imageResource));
|
||||
imageLineItem->setAttributeValue("dummy", id);
|
||||
|
||||
Reference in New Issue
Block a user