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

View File

@@ -207,7 +207,7 @@ private:
void addTimeoutView(); void addTimeoutView();
void showPartnerSites(); void showPartnerSites();
void sendImage(); void sendImage();
void imageUploaded(Wt::WFileUpload *fileWidget, std::shared_ptr<Magick::Image> localImage, Wt::WImage *image, Wt::WPushButton *okButton); void imageUploaded(Wt::WFileUpload *fileWidget, std::shared_ptr<Magick::Blob> localImage, Wt::WImage *image, Wt::WPushButton *okButton);
bool isAnimatedGIF(const Magick::Blob &blob); bool isAnimatedGIF(const Magick::Blob &blob);
}; };

View File

@@ -255,7 +255,7 @@ Wt::Json::Object Broadcast::addMessage(std::string fromSessionId, std::string to
}; };
} }
Wt::Json::Object Broadcast::addImage(std::string fromSessionId, std::string toUserName, std::shared_ptr<Magick::Image> image) { Wt::Json::Object Broadcast::addImage(std::string fromSessionId, std::string toUserName, std::shared_ptr<Magick::Blob> image) {
auto message = Message(fromSessionId, image); auto message = Message(fromSessionId, image);
return addMessage(fromSessionId, toUserName, message); return addMessage(fromSessionId, toUserName, message);
} }
@@ -658,7 +658,7 @@ Broadcast::Message::Message(std::string fromSessionId_, Wt::WString message_):
sendTime = Wt::WDateTime::currentDateTime(); sendTime = Wt::WDateTime::currentDateTime();
} }
Broadcast::Message::Message(std::string fromSessionId_, std::shared_ptr<Magick::Image> image_): Broadcast::Message::Message(std::string fromSessionId_, std::shared_ptr<Magick::Blob> imageBlob):
fromSessionId(fromSessionId_), fromSessionId(fromSessionId_),
sendType("image") { sendType("image") {
auto timestamp = std::time(nullptr); auto timestamp = std::time(nullptr);
@@ -667,12 +667,12 @@ Broadcast::Message::Message(std::string fromSessionId_, std::shared_ptr<Magick::
auto hash = hashObj.compute(combinedString, "salt"); auto hash = hashObj.compute(combinedString, "salt");
messageId = Wt::WString(hash); messageId = Wt::WString(hash);
sendTime = Wt::WDateTime::currentDateTime(); sendTime = Wt::WDateTime::currentDateTime();
Magick::Blob imageBlob; Magick::Image image_;
image_->write(&imageBlob); image_.read(*imageBlob);
image = { image = {
{"width", Wt::Json::Value((int)image_->columns())}, {"width", Wt::Json::Value((int)image_.columns())},
{"height", Wt::Json::Value((int)image_->rows())}, {"height", Wt::Json::Value((int)image_.rows())},
{"imageblobbase64", Wt::Json::Value(imageBlob.base64())} {"imageblobbase64", Wt::Json::Value(imageBlob->base64())}
}; };
} }

View File

@@ -14,6 +14,7 @@
namespace Magick { namespace Magick {
class Image; class Image;
class Blob;
} }
struct ConversationItem { struct ConversationItem {
@@ -50,7 +51,7 @@ public:
struct Message { struct Message {
Message()= default; Message()= default;
Message(std::string fromSessionId_, Wt::WString message_); Message(std::string fromSessionId_, Wt::WString message_);
Message(std::string fromSessionId_, std::shared_ptr<Magick::Image> image_); Message(std::string fromSessionId_, std::shared_ptr<Magick::Blob> image_);
Message(Wt::WString message_); Message(Wt::WString message_);
bool systemMessage{false}; bool systemMessage{false};
std::string fromSessionId; std::string fromSessionId;
@@ -86,7 +87,7 @@ public:
Wt::WString getCountryIsoCodeByCountry(Wt::WString country); Wt::WString getCountryIsoCodeByCountry(Wt::WString country);
std::list<Wt::Json::Object> getBroadcastsForSession(std::string sessionId); std::list<Wt::Json::Object> getBroadcastsForSession(std::string sessionId);
Wt::Json::Object addMessage(std::string fromSessionId, std::string toUserName, Message message); Wt::Json::Object addMessage(std::string fromSessionId, std::string toUserName, Message message);
Wt::Json::Object addImage(std::string fromSessionId, std::string toUserName, std::shared_ptr<Magick::Image> image); Wt::Json::Object addImage(std::string fromSessionId, std::string toUserName, std::shared_ptr<Magick::Blob> image);
void setConversationRead(std::string readingUserSessionId, std::string secondUserName); void setConversationRead(std::string readingUserSessionId, std::string secondUserName);
void sendConversation(std::string sessionId1, std::string userName2); void sendConversation(std::string sessionId1, std::string userName2);
void sendOpenConversations(std::string forSessionId); void sendOpenConversations(std::string forSessionId);