Files
KJD_WebService/TEMUKJD/ToolForms/DouBaoImgCefForm.cs
T

523 lines
22 KiB
C#

using AllBase;
using AllBase.Model.Result;
using AllBase.Model.Result.TemuResult;
using CefSharp;
using CefSharp.WinForms;
using NaiBa.Util.Extension;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using TemuKJD.BaseForms;
using TemuKJD.Helper;
using TemuKJD.KJDForms.ProductSelectForms;
using Work;
using Work.BLL.Tools;
namespace TemuKJD.ToolForms
{
public partial class DouBaoImgCefForm : LRBaseForm
{
ChromiumWebBrowser cefWebBrowser = null;
KJDDBProduct dbProd = null;
string Url { get; set; } = "https://www.doubao.com/chat/";
List<Cookie> Cookies = new List<Cookie>();
public DouBaoImgCefForm(KJDDBProduct _dbProd, string url = "", List<Cookie> cookies = null)
{
InitializeComponent();
if (_dbProd != null)
dbProd = _dbProd;
if (!string.IsNullOrEmpty(url))
Url = url;
if (cookies != null)
Cookies = cookies;
this.Width = Math.Min(1600, Screen.PrimaryScreen.Bounds.Width);
this.Height = Math.Min(900, Screen.PrimaryScreen.Bounds.Height);
this.StartPosition = FormStartPosition.CenterScreen;
}
private void DouBaoCefForm_Load(object sender, EventArgs e)
{
cefWebBrowser = NaiBa.CefHelper.CEFBrowser.CreateChromiumWebBrowser(Url);
cefWebBrowser.AutoSize = true;
cefWebBrowser.Dock = DockStyle.Fill;
//cefWebBrowser.RequestContext = new RequestContext(requestContextSettings);
cefWebBrowser.KeyboardHandler = new KJDForms.ToolForms.CefKeyboardHandler();
cefWebBrowser.FrameLoadEnd += CefWebBrowser_FrameLoadEnd;
cefWebBrowser.AddressChanged += CefWebBrowser_AddressChanged;
CustomDownloadHandler downloadHandler = new CustomDownloadHandler();
downloadHandler.DownloadCompleteEvent += DownloadHandler_DownloadComplete;
cefWebBrowser.DownloadHandler = downloadHandler;
panel2.Controls.Add(cefWebBrowser);
this.splitContainer3.Panel2.Controls.Clear();
if (BaseClass.MainPath=="kuajingda")
{
try
{
var temuDBProd = DbProductSelectListManageForm.GetProductDetail(dbProd.id.ToString());
if (temuDBProd == null || temuDBProd.id == 0)
{
BaseMsgForm.ShowError("商品已清除!");
return;
}
dbProd = temuDBProd;
var prodInfo = JsonHelper.DeserializeJsonToObject<TemuDetailProductInfo>(dbProd.product_json);
var ucImgChangeList = new List<UcSkuImgItem>();
foreach(var sku in prodInfo.productSkcList[0].productSkuList)
{
var imgUrl = sku.thumbUrl.Replace("https://", "http://");
if (!ucImgChangeList.Any(p=>p.pbSkuOriginalImg.ImageLocation == imgUrl))
{
UcSkuImgItem skuImgItem = new UcSkuImgItem(prodInfo.productId.ParseToLong(), sku.productSkuSpecList[0].specId.ParseToLong(),
sku.productSkuSpecList[0].specName, imgUrl);
skuImgItem.pbSkuOriginalImg.ImageLocation = imgUrl;
skuImgItem.pbSkuOriginalImg.Tag = "{\"productId\":" + prodInfo.productId +
",\"skuId\":" + sku.productSkuId +
",\"specId\":" + sku.productSkuSpecList[0].specId +
",\"specName\":\"" + sku.productSkuSpecList[0].specName + "\"}";
skuImgItem.pbSkuOriginalImg.Name = sku.productSkuId.ToString();
skuImgItem.chkSpecName.Text = sku.productSkuSpecList[0].specName;
skuImgItem.chkSpecName.Tag = skuImgItem;
skuImgItem.chkSpecName.CheckedChanged += ChkSpecName_CheckedChanged;
skuImgItem.btnGetOriginalImg.Tag = skuImgItem;
skuImgItem.btnGetOriginalImg.Click += btnGetOriginalImg_Click;
skuImgItem.btnUploadImg.Tag = skuImgItem;
skuImgItem.btnUploadImg.Click += btnUploadImg_Click;
skuImgItem.pbSkuOriginalImg.Tag = skuImgItem;
skuImgItem.pbSkuOriginalImg.Click += pbSkuOriginalImg_Click;
skuImgItem.pbSkuImg.Tag = skuImgItem;
skuImgItem.pbSkuImg.Click += PbSkuImg_Click;
skuImgItem.Dock = DockStyle.Top;
ucImgChangeList.Add(skuImgItem);
this.splitContainer3.Panel2.Controls.Add(skuImgItem);
}
}
pbLoading.Visible = true;
pbLoading.BringToFront();
pbLoading2.Visible = true;
pbLoading2.BringToFront();
Task.Run(() =>
{
foreach (Control c in this.splitContainer3.Panel2.Controls)
{
var skuImgItem = c as UcSkuImgItem;
if (skuImgItem == null)
continue;
var skuImgLst = GetSkuImgList(skuImgItem.ProdId.ParseToString(), skuImgItem.SpecId.ParseToString());
skuImgItem.LstSkuImgInfo = skuImgLst;
if (skuImgLst.Count > 0)
{
var skuImgInfo = skuImgLst.First();
Invoke(new Action(() =>
{
//if (!string.IsNullOrWhiteSpace(skuImgInfo.img_url))
// skuImgItem.pbSkuImg.ImageLocation = skuImgInfo.img_url.Replace("img.kwcdn.com", "img.cdnfe.com").Replace("https://", "http://");
//else
if (!string.IsNullOrWhiteSpace(skuImgInfo.img_base64))
skuImgItem.pbSkuImg.Image = Base64ChangeImgUrl.Base64ToImage(skuImgInfo.img_base64);
}));
}
}
Invoke(new Action(() =>
{
pbLoading.Visible = false;
pbLoading2.Visible = false;
}));
});
}
catch (Exception ex)
{
BaseMsgForm.ShowError(ex.Message);
}
}
}
private void ChkSpecName_CheckedChanged(object sender, EventArgs e)
{
var chk = sender as UserComponent.UcCheckBox;
if (chk == null)
return;
var skuImgItem = chk.Tag as UcSkuImgItem;
if (skuImgItem == null)
return;
if (skuImgItem.chkSpecName.Checked)
SetCurrentSkuImgItem(skuImgItem);
}
private void DownloadHandler_DownloadComplete(object browser, DownloadItem downloadItem)
{
//BaseMsgForm.ShowInfo(downloadItem.FullPath + "下载完成");
Invoke(new Action(() =>
{
if(currentSkuImgItem == null)
{
BaseMsgForm.ShowInfo("当前未选择sku,点击选择sku再下载,图片将直接上传到服务端!");
this.lblMsg.Text = downloadItem.FullPath + "下载完成";
}
else
{
if (UpdateSkuImg(currentSkuImgItem, downloadItem.FullPath))
{
this.lblMsg.Text = downloadItem.FullPath + "下载并上传服务端完成";
}
else
{
this.lblMsg.Text = downloadItem.FullPath + "下载完成";
}
}
this.pnlMsg.Visible = true;
}));
Task.Run(() =>
{
Thread.Sleep(2000);
Invoke(new Action(() =>
{
this.pnlMsg.Visible = false;
}));
});
}
public static List<AiSkuImgInfo> GetSkuImgList(string prodId, string specId, int pageSize = 50, bool isRandom = false)
{
var url = BaseClass.BuildObjString("product/get_sku_image_list");
var data = UserLogin.GetSignaturex();
data += "&search_product_id=" + prodId;
data += "&search_spec_id=" + specId;
data += "&page_size=" + pageSize;
if (isRandom)
{
data += "&is_random=true";
}
var html = GetHtml.PostUtf8(url, data);
if (string.IsNullOrEmpty(html) || !html.Contains("\"code\":200"))
html = GetHtml.PostUtf8(url, data);
if (string.IsNullOrEmpty(html) || !html.Contains("\"code\":200"))
html = GetHtml.PostUtf8(url, data);
if (string.IsNullOrEmpty(html) || !html.Contains("\"code\":200"))
{
BaseMsgForm.ShowError("SKU图片查询失败,请重试!" + BaseRegex.GetStringJson(ref html, "msg"));
return new List<AiSkuImgInfo>();
}
else
{
try
{
JObject jObj = JObject.Parse(html);
return JsonHelper.DeserializeJsonToList<AiSkuImgInfo>(jObj["data"].ToString());
}
catch(Exception ex)
{
BaseMsgForm.ShowError("SKU图片查询失败,请重试!" + ex.Message);
return new List<AiSkuImgInfo>();
}
}
}
private void pbSkuOriginalImg_Click(object sender, EventArgs e)
{
var pb = sender as PictureBox;
if (pb == null)
return;
if (!string.IsNullOrEmpty(pb.ImageLocation))
{
ShowImgForm imgFrom = new ShowImgForm(pb.ImageLocation);
imgFrom.ShowDialog();
}
else
{
ShowImgForm imgFrom = new ShowImgForm(pb.Image);
imgFrom.ShowDialog();
}
var skuImgItem = pb.Tag as UcSkuImgItem;
if (skuImgItem == null)
return;
//SetCurrentSkuImgItem(skuImgItem);
}
private void PbSkuImg_Click(object sender, EventArgs e)
{
var pb = sender as PictureBox;
if (pb == null)
return;
var skuImgItem = pb.Tag as UcSkuImgItem;
if (skuImgItem == null)
return;
//SetCurrentSkuImgItem(skuImgItem);
DouBaoImgListForm imgLstForm = new DouBaoImgListForm(skuImgItem.LstSkuImgInfo);
imgLstForm.ShowDialog();
var imgInfo = skuImgItem.LstSkuImgInfo.FirstOrDefault();
if (imgInfo == null)
{
skuImgItem.pbSkuImg.Image = Properties.Resources.nopic;
}
else
{
if (!string.IsNullOrWhiteSpace(imgInfo.img_url))
skuImgItem.pbSkuImg.ImageLocation = imgInfo.img_url;
else if (!string.IsNullOrWhiteSpace(imgInfo.img_base64))
skuImgItem.pbSkuImg.Image = Base64ChangeImgUrl.Base64ToImage(imgInfo.img_base64);
}
}
private void btnGetOriginalImg_Click(object sender, EventArgs e)
{
var pnl = sender as DevComponents.DotNetBar.PanelEx;
if (pnl == null)
return;
var skuImgItem = pnl.Tag as UcSkuImgItem;
if (skuImgItem == null)
return;
SetCurrentSkuImgItem(skuImgItem);
var pb = skuImgItem.pbSkuOriginalImg;
if (pb.Image == null)
{
BaseMsgForm.ShowError("图片为空!");
return;
}
string fileName = DateTime.Now.ToString("yyyy_MM_dd_HH_mm_ss") + ".jpg";
if (!string.IsNullOrEmpty(pb.ImageLocation))
{
fileName = pb.ImageLocation.Replace("://", ".").Replace('/', '.');
}
SaveFileDialog sfd = new SaveFileDialog();
sfd.Filter = "JPeg Image|*.jpg;*.jpeg";
sfd.Title = "保存图片";
sfd.FileName = fileName;
if (sfd.ShowDialog() == DialogResult.OK)
{
pb.Image.Save(sfd.FileName, System.Drawing.Imaging.ImageFormat.Jpeg);
}
}
private void btnUploadImg_Click(object sender, EventArgs e)
{
var pnl = sender as DevComponents.DotNetBar.PanelEx;
if (pnl == null)
return;
var skuImgItem = pnl.Tag as UcSkuImgItem;
if (skuImgItem == null)
return;
SetCurrentSkuImgItem(skuImgItem);
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Multiselect = false;
// 设置过滤条件,只显示文本文件
openFileDialog.Filter = "图片文件 (*.jpeg;*.jpg;*.png)|*.jpeg;*.jpg;*.png|All files (*.*)|*.*";
// 显示对话框并获取结果
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
string filePath = openFileDialog.FileName;
UpdateSkuImg(skuImgItem, filePath);
}
}
bool UpdateSkuImg(UcSkuImgItem skuImgItem, string filePath)
{
try
{
Image image = Image.FromFile(filePath);
ImageBuild ib = null;
using (MemoryStream memoryStream = new MemoryStream())
{
image.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Jpeg);
byte[] imageBytes = memoryStream.ToArray();
ib = new ImageBuild(imageBytes);
}
var newImgBytes = ib.BuildNewSize(800, 800, 85);
Bitmap bitmap = null;
using (MemoryStream ms = new MemoryStream(newImgBytes))
{
//skuImgItem.pictureBox2.Image = Image.FromStream(ms);
// 将image转成bitmap以后使用才能释放生成MemoryStream,否则保存Image对象到文件会产生GDI+中发生一般性错误
bitmap = new Bitmap(Image.FromStream(ms));
// 打码,打上马赛克
var x = txtXPos.Text.ParseToInt();
var y = txtYPos.Text.ParseToInt();
var cx = txtXSize.Text.ParseToInt();
var cy = txtYSize.Text.ParseToInt();
//bitmap = ApplyMosaicEffect(bitmap, new Rectangle(665, 740, 125, 50), 25);
bitmap = ApplyMosaicEffect(bitmap, new Rectangle(x, y, cx, cy), 60);
//skuImgItem.pictureBox2.Image = bitmap;
}
string imgBase64 = "";
using (MemoryStream memoryStream = new MemoryStream())
{
bitmap.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Jpeg);
byte[] imageBytes = memoryStream.ToArray();
imgBase64 = Convert.ToBase64String(imageBytes);
}
string img_md5 = BaseClass.GetMd5(imgBase64);
var url = BaseClass.BuildObjString("product/add_sku_image");
var data = UserLogin.GetSignaturex();
data += "&img_base64=" + imgBase64;
data += "&img_md5=" + img_md5;
data += "&product_id=" + skuImgItem.ProdId;
data += "&spec_id=" + skuImgItem.SpecId;
data += "&spec_name=" + skuImgItem.SpecName;
data += "&original_img_url=" + skuImgItem.SpecImgUrl;
data += "&original_img_url_md5=" + BaseClass.GetMd5(skuImgItem.SpecImgUrl);
var html = GetHtml.PostUtf8(url, data);
if (string.IsNullOrEmpty(html) || !html.Contains("\"code\":200"))
html = GetHtml.PostUtf8(url, data);
if (string.IsNullOrEmpty(html) || !html.Contains("\"code\":200"))
html = GetHtml.PostUtf8(url, data);
if (string.IsNullOrEmpty(html) || !html.Contains("\"code\":200"))
{
BaseMsgForm.ShowError("sku图片上传服务端失败,请重试!" + BaseRegex.GetStringJson(ref html, "msg"));
return false;
}
else
{
skuImgItem.LstSkuImgInfo.Insert(0, new AiSkuImgInfo()
{
id = BaseRegex.GetIntJson(ref html, "sku_img_id"),
add_time = DateTime.Now,
mdy_time = DateTime.Now,
img_base64 = imgBase64,
img_base64_db_id = BaseRegex.GetIntJson(ref html, "sku_img_Base64_id"),
img_md5 = img_md5,
img_url = "",
original_img_url = skuImgItem.SpecImgUrl,
product_id = skuImgItem.ProdId.ParseToString(),
spec_id = skuImgItem.SpecId.ParseToString(),
spec_name = skuImgItem.SpecName,
});
skuImgItem.pbSkuImg.Image = bitmap;
}
return true;
}
catch (Exception ex)
{
BaseMsgForm.ShowError("sku图片上传服务端失败!" + ex.Message);
return false;
}
}
private UcSkuImgItem currentSkuImgItem = null;
void SetCurrentSkuImgItem(UcSkuImgItem skuImgItem)
{
if (skuImgItem != null)
{
currentSkuImgItem = skuImgItem;
foreach (var item in splitContainer3.Panel2.Controls)
{
var imgItem = item as UcSkuImgItem;
if (imgItem != null && imgItem != skuImgItem)
{
imgItem.BackColor = Color.LightSteelBlue;
imgItem.chkSpecName.Checked = false;
}
}
skuImgItem.BackColor = Color.DodgerBlue;
}
}
private void CefWebBrowser_AddressChanged(object sender, CefSharp.AddressChangedEventArgs e)
{
if (this.Created)
{
Invoke(new Action(() =>
{
txtUrl.Text = e.Address;
}));
}
}
private void CefWebBrowser_FrameLoadEnd(object sender, CefSharp.FrameLoadEndEventArgs e)
{
}
private void btnGoTo_Click(object sender, EventArgs e)
{
this.cefWebBrowser.Load(txtUrl.Text.Trim());
}
/// <summary>
/// 给图片打上马赛克
/// </summary>
/// <param name="original"></param>
/// <param name="mosaicRect"></param>
/// <param name="mosaicSize"></param>
/// <returns></returns>
public static Bitmap ApplyMosaicEffect(Bitmap original, Rectangle mosaicRect, int mosaicSize)
{
int width = original.Width;
int height = original.Height;
//Bitmap mosaicBitmap = new Bitmap(width, height);
//using (Graphics g = Graphics.FromImage(mosaicBitmap))
using (Graphics g = Graphics.FromImage(original))
{
//for (int x = 0; x < width; x += mosaicSize)
//{
// for (int y = 0; y < height; y += mosaicSize)
// {
// Color c = GetAverageColor(original, x, y, mosaicSize);
// Brush brush = new SolidBrush(c);
// g.FillRectangle(brush, x, y, mosaicSize, mosaicSize);
// brush.Dispose();
// }
//}
for (int x = mosaicRect.X; x < width && x < mosaicRect.Right; x += mosaicSize)
{
for (int y = mosaicRect.Y; y < height && y < mosaicRect.Bottom; y += mosaicSize)
{
Color c = GetAverageColor(original, x, y, Math.Min(mosaicRect.Right - x, mosaicSize), Math.Min(mosaicRect.Bottom - y, mosaicSize));
Brush brush = new SolidBrush(c);
g.FillRectangle(brush, x, y, Math.Min(mosaicRect.Right - x, mosaicSize), Math.Min(mosaicRect.Bottom - y, mosaicSize));
brush.Dispose();
}
}
}
//return mosaicBitmap;
return original;
}
static Color GetAverageColor(Bitmap bmp, int x, int y, int xsize, int ysize)
{
int r = 0, g = 0, b = 0;
int count = 0;
for (int i = x; i < x + xsize && i < bmp.Width; i++)
{
for (int j = y; j < y + ysize && j < bmp.Height; j++)
{
Color c = bmp.GetPixel(i, j);
r += c.R; g += c.G; b += c.B; count++;
}
}
return Color.FromArgb(r / count, g / count, b / count);
}
}
}