pic upload

This commit is contained in:
Torsten Schulz
2024-02-23 12:37:37 +01:00
parent 064304a506
commit d6baee37e3
4 changed files with 52 additions and 32 deletions

View File

@@ -39,6 +39,7 @@
#include <Wt/WGridLayout.h>
#include <Wt/WCheckBox.h>
#include <Wt/WTimer.h>
#include <Wt/WResource.h>
App::App(const Wt::WEnvironment &env, Broadcast &server):
Wt::WApplication(env),
@@ -446,7 +447,7 @@ void App::sendImage() {
auto image = layout->addNew<Wt::WImage>();
image->setMaximumSize(Wt::WLength(100, Wt::LengthUnit::Pixel), Wt::WLength(100, Wt::LengthUnit::Pixel));
image->setHeight(Wt::WLength::Auto);
auto localImage = std::make_shared<Magick::Image>();
auto localImage = std::make_shared<Magick::Blob>();
auto buttonsContainer = layout->addNew<Wt::WContainerWidget>();
auto okButton = buttonsContainer->addNew<Wt::WPushButton>("Send image");
fileWidget->uploaded().connect([=, this]() mutable {
@@ -466,29 +467,33 @@ void App::sendImage() {
fileDialog->show();
}
void App::imageUploaded(Wt::WFileUpload *fileWidget, std::shared_ptr<Magick::Image> localImage, Wt::WImage *image, Wt::WPushButton *okButton) {
void App::imageUploaded(Wt::WFileUpload *fileWidget, std::shared_ptr<Magick::Blob> localImage, Wt::WImage *image, Wt::WPushButton *okButton) {
try {
std::list<Magick::Image> originalImages;
Magick::readImages(&originalImages, fileWidget->spoolFileName());
std::list<Magick::Image> coalescedList;
Magick::coalesceImages(&coalescedList, originalImages.begin(), originalImages.end());
Magick::Image coalescedImage;
Magick::Blob coalescedBlob;
Magick::writeImages(coalescedList.begin(), coalescedList.end(), &coalescedBlob);
coalescedImage.read(coalescedBlob);
*localImage = coalescedImage;
Magick::Blob previewBlob;
coalescedImage.write(&previewBlob);
Magick::writeImages(coalescedList.begin(), coalescedList.end(), &previewBlob);
auto previewBase64 = previewBlob.base64();
auto previewImage = Wt::Utils::base64Decode(previewBase64);
std::string imageFormat = coalescedImage.magick();
std::list<Magick::Image> previewList;
std::list<Magick::Image> localList;
std::transform(originalImages.begin(), originalImages.end(), std::back_inserter(previewList), [](const Magick::Image& img) { return img; });
std::transform(originalImages.begin(), originalImages.end(), std::back_inserter(localList), [](const Magick::Image& img) { return img; });
Magick::coalesceImages(&previewList, previewList.begin(), previewList.end());
Magick::coalesceImages(&localList, localList.begin(), localList.end());
auto resize = [](std::string size, std::list<Magick::Image> &imagesList) {
for (auto &frame : imagesList) {
frame.resize(size);
}
};
resize("100x100^", previewList);
resize("500x500^", localList);
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>(previewImage.begin(), previewImage.end()));
std::vector<unsigned char>(resizedImageString.begin(), resizedImageString.end()));
image->setImageLink(Wt::WLink(imageResource));
image->resize(Wt::WLength(localImage->columns(), Wt::LengthUnit::Pixel), Wt::WLength(localImage->rows(), Wt::LengthUnit::Pixel));
std::cout << __LINE__ << std::endl;
okButton->setEnabled(true);
triggerUpdate();
} catch (const std::exception& e) {
@@ -496,6 +501,8 @@ void App::imageUploaded(Wt::WFileUpload *fileWidget, std::shared_ptr<Magick::Ima
}
}
Magick::Image App::scaleImage(const Magick::Image& originalImage, int maxSize) const {
int scale = 100;
int maxDimension = std::max(originalImage.size().width(), originalImage.size().height());
@@ -662,19 +669,32 @@ 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>();
auto imageBlob = Wt::Utils::base64Decode((std::string)imageDescription["imageblobbase64"]);
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);
auto imageResource = std::make_shared<Wt::WMemoryResource>(
"image/" + imageFormat,
std::vector<unsigned char>(imageBlob.begin(), imageBlob.end()));
std::vector<unsigned char>(resizedImageString.begin(), resizedImageString.end())); // Verwenden Sie den direkt decodierten Inhalt
std::cout << __LINE__ << std::endl;
image->setImageLink(Wt::WLink(imageResource));
image->resize(Wt::WLength((int)imageDescription["width"], Wt::LengthUnit::Pixel), Wt::WLength((int)imageDescription["height"], Wt::LengthUnit::Pixel));
imageLineItem->setAttributeValue("dummy", id);
return imageLineItem;
}
@@ -767,7 +787,6 @@ void App::updateUserinfo(Wt::Json::Object data) {
auto infoWidgetLayout = (Wt::WHBoxLayout*)infoWidget->layout();
auto infoTextWidget = dynamic_cast<Wt::WText*>(infoWidgetLayout->itemAt(1)->widget());
auto blockButton = dynamic_cast<Wt::WPushButton*>(infoWidgetLayout->itemAt(2)->widget());
std::cout << Wt::Json::serialize(userData) << std::endl;
try {
infoWidget->setStyleClass(Wt::WString("user-conversation-info userlist-gender-{1}").arg((std::string)userData["gender"]));
if (infoTextWidget) {