pic upload
This commit is contained in:
63
src/app.cpp
63
src/app.cpp
@@ -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> ").arg(writer);
|
auto outputText = Wt::WString("<b>{1}:</b> ").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) {
|
||||||
|
|||||||
@@ -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);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -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())}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user