523 lines
22 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|