Animated gifs are working now

This commit is contained in:
Torsten Schulz
2024-04-08 09:35:35 +02:00
parent ba976db321
commit e05a9429b9
5 changed files with 48 additions and 94 deletions

View File

@@ -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>&nbsp;").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);