I am busy trying to understand how to work with images from a website -> service -> email.
What I have done so far is converting the image to base64 then uploading it to my service. Next I convert it to a byte array and then store it into my database.
At the same time when inserting the byte into my database I want to send the image by attaching it to an email.
At this time the attachment is only a file that I cannot open, so I guess it is just a byte array and not an Image.
C#
public string SendEmail(string send)
{
try
{
TestDb db = new TestDb();
TestImage result = new TestImage();
string[] arData = send.Split('|');
byte[] bytes = new byte[arData[0].Length * sizeof(char)];
System.Buffer.BlockCopy(arData[0].ToCharArray(), 0, bytes, 0, bytes.Length);
result.TestImg = bytes;
result.TestId = int.Parse(arData[1].ToString());
db.TestImage.Attach(result);
db.TestImage.Add(result);
db.SaveChanges();
string foto = "name";
Attachment att = new Attachment(new MemoryStream(bytes), foto);
MailMessage mail = new MailMessage();
NetworkCredential cred = new NetworkCredential("Test#gmail.com", "Test123");
mail.To.Add("Test#gmail.com");
mail.Subject = "subject Test";
mail.Attachments.Add(att);
mail.From = new MailAddress("Test#gmail.com");
System.Net.Mail.SmtpClient smtp = new System.Net.Mail.SmtpClient("smtp.gmail.com", 587);
smtp.UseDefaultCredentials = false;
smtp.EnableSsl = true;
smtp.Credentials = cred;
smtp.Send(mail);
return result.Id.ToString();
}
catch (Exception)
{
throw;
}
}
Angularjs
$scope.link = '\img\ionic.png';
var imageData=$base64.encode($scope.link);
$scope.sendimg = function() {
console.log(imageData);
$http.post("http://localhost:53101/TruckService.svc/sendEmail/" + imageData + '|' + 1
)
.success(function(data) {
})
.error(function(data) {
console.log("failure");
})
}
I think the problem is with converting image to base64. So check whether you have correct image in imageData by convert it back to an image.
You can use online tools to converto base64 to image Link
So if it's the problem, try to convert your image as below,
function toDataUrl(url, callback, outputFormat){
var img = new Image();
img.crossOrigin = 'Anonymous';
img.onload = function(){
var canvas = document.createElement('CANVAS');
var ctx = canvas.getContext('2d');
var dataURL;
canvas.height = this.height;
canvas.width = this.width;
ctx.drawImage(this, 0, 0);
dataURL = canvas.toDataURL(outputFormat);
callback(dataURL);
canvas = null;
};
img.src = url;
}
toDataUrl('url', function(base64Img){
// Base64DataURL
});
In my case it comes from my Resources. But in the end its the same. After maken a byte[] I attach it like this:
byte[] logo = BmpToBytes_MemStream(Properties.Resources.gcs_logo);
emailMessage.Attachments.AddFileAttachment("logo.jpg", logo);
emailMessage.Attachments[emailMessage.Attachments.Count - 1].IsInline = true;
emailMessage.Attachments[emailMessage.Attachments.Count - 1].ContentId = "gcs_logo.jpg";
private static byte[] BmpToBytes_MemStream(Bitmap bmp)
{
byte[] bmpBytes = null;
using (MemoryStream ms = new MemoryStream())
{
// Save to memory using the Jpeg format
bmp.Save(ms, ImageFormat.Jpeg);
// read to end
bmpBytes = ms.GetBuffer();
bmp.Dispose();
}
return bmpBytes;
}
Hope this helps.
Related
I am writing a UWP application using the MapControl I have implemented my own MapTileSource like so:
var nativeTileLayer = new MapTileSource();
nativeTileLayer.DataSource = new UWPSyncTileLayer();
nativeTileLayer.TilePixelSize = outerItem.TileSize;
nativeTileLayer.AllowOverstretch = true;
// NativeMap.Style = MapStyle.None;
outerItem.NativeObject = nativeTileLayer;
NativeMap.TileSources.Clear();
NativeMap.TileSources.Add(nativeTileLayer);
return nativeTileLayer;
Where UWPSyncTileLayer is my own implementation of CustomMapTileDataSource
internal class UWPSyncTileLayer : CustomMapTileDataSource
{
public UWPSyncTileLayer(int tileSize = 256)
{
this.BitmapRequested += UWPSyncTileLayer_BitmapRequested;
}
private void UWPSyncTileLayer_BitmapRequested(CustomMapTileDataSource sender, MapTileBitmapRequestedEventArgs args)
{
var deferral = args.Request.GetDeferral();
var data = Convert.FromBase64String("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".Split(",".ToCharArray(), 2)[1]);
MemoryStream stream = new MemoryStream();
stream.Write(data, 0, data.Length);
stream.Position = 0;
var decoder = Windows.Graphics.Imaging.BitmapDecoder.CreateAsync(stream.AsRandomAccessStream()).AsTask().Result;
var pixelProvider = decoder.GetPixelDataAsync().AsTask().Result;// Windows.Graphics.Imaging.BitmapPixelFormat.Rgba8, Windows.Graphics.Imaging.BitmapAlphaMode.Ignore, new Windows.Graphics.Imaging.BitmapTransform(), Windows.Graphics.Imaging.ExifOrientationMode.RespectExifOrientation, Windows.Graphics.Imaging.ColorManagementMode.ColorManageToSRgb).AsTask().Result;
var pixelData = pixelProvider.DetachPixelData();
InMemoryRandomAccessStream randomAccessStream = new InMemoryRandomAccessStream();
IOutputStream outputStream = randomAccessStream.GetOutputStreamAt(0);
DataWriter writer = new DataWriter(outputStream);
writer.WriteBytes(pixelData);
var i = writer.StoreAsync().AsTask().Result;
var d = writer.FlushAsync().AsTask().Result;
args.Request.PixelData = RandomAccessStreamReference.CreateFromStream(randomAccessStream);
deferral.Complete();
}
}
But the image is always blank.
Does anyone know what I'm doing wrong?
I can't tell from your data stream, but it looks like you might be passing a compressed PNG stream to the PixelData property. You'll need to decode a PNG to RGB values and set PixelData to the decoded RGBA buffer. See the example code here:https://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.maps.maptilebitmaprequest.pixeldata.aspx
I wrote this code
MemoryStream ms = new MemoryStream();
pictureBox1.Image.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
Now I want to check ms text. How can I do that?
With this code, you can encode the image Bytes into an hexadecimal string representation:
Byte[] a = ms.ToArray();
String text = BitConverter.ToString(a);
You can try with this code....
var url = HostingEnvironment.MapPath("~/Images/" + name);
byte[] myByte = System.IO.File.ReadAllBytes(url);
using (MemoryStream ms = new MemoryStream())
{
ms.Write(myByte, 0, myByte.Length);
i = System.Drawing.Image.FromStream(ms);
System.Drawing.Image imageIn = i.GetThumbnailImage(100, 100,()=> false, IntPtr.Zero);
imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
var storedUrl = "data:image;base64," + Convert.ToBase64String(ms.ToArray());
return storedUrl;
}
I use this to send the image as string:
string path = #"C:\Users\user6\Pictures\wp\tinypotato.jpg";
string myString = Convert.ToBase64String(File.ReadAllBytes(path))
Debug.WriteLine(myString);
...
BR!
I'm comparing two images; the source is in my solution (and saving it to memory stream) and other I am downloading using 'WebClient' converting it to bytes and then saving it in a stream, then comparing the streams.
They are exactly the same image. However my code produces different hash strings, so the 'If Equals' produces a false.
I'm thinking the downloading and saving of the image is altering the string.
The code:
public void CompareImages(string icon)
{
WebClient wc = new WebClient();
MemoryStream ms = new MemoryStream();
Image expectedImage = Image.FromFile(AppConfig.ToolsFilesFolderName + string.Format("\\" + icon +".png"));
expectedImage.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
String firstBitmap = Convert.ToBase64String(ms.ToArray());
ms.Position = 0;
MemoryStream ms2 = null;
byte[] bytes;
var baseEventType = _driver.FindElement(By.XPath("//div[#id='EventsView2_tv']/div/div")); ///div/div/div[19] //what i need to do is expand all of them and then
int count = 0;
var eventTypeExists = baseEventType.FindElements(By.TagName("tr"));
for (int i = 0; i < eventTypeExists.Count; i++)
{
if (i>30)
return;
if (eventTypeExists[i].Text.Trim().ToLower().Equals(icon.ToLower()))
{
var imgPath = eventTypeExists[i].FindElement(By.XPath("td[3]/img"));
var imageUrl = imgPath.GetAttribute("src");
bytes = wc.DownloadData(imageUrl);
ms2 = new MemoryStream(bytes);
Image actualImage = Image.FromStream(ms2);
actualImage.Save(ms2, System.Drawing.Imaging.ImageFormat.Png);
String secondBitmap = Convert.ToBase64String(ms2.ToArray());
if (firstBitmap.Equals(secondBitmap))
{
Reporter.ReportNote(string.Format("'{0}' icon in '{1}' is correct",
icon, ScenarioContext.Current["contractName"] + "/" + eventTypeExists[i].FindElement(By.XPath("../../../../table[" + (i - 2) + "]")).Text),
Status.Pass);
}
else
{
Reporter.ReportNote(string.Format("Icons are not correct, offending image is located within '{0}'",
ScenarioContext.Current["contractName"] + "/" + eventTypeExists[i].FindElement(By.XPath("../../../../table[" + (i - 2) +"]")).Text),
Status.Done);
}
ms2.Dispose();
}
count++;
}
ms.Dispose();
wc.Dispose();
}
I am using zxing library to generate and decode the QR codes. I my application I am generating QR code dynamically and sending the file containing QR by fax API. If I get this fax message from the api and decode it, Qr code is read successfully, but when I send a scanned copy of this file by fax and then receive and read it I am unable to do that. But if I try to read this file using my mobile Qr application it properly reads the Qr code. I am unable to find a solution how to read this file.
Methods used for encoding:
public static System.Drawing.Image GenerateJSONQrCode(QRJsonFax model)
{
var jsonString = JsonConvert.SerializeObject(model);
//encrypt json string
jsonString = Hugo.BLL.Utilities.EncryptionHelper.EncryptQR(jsonString, FaxSetting.IsUseHashing);
var bw = new ZXing.BarcodeWriter();
var encOptions = new ZXing.Common.EncodingOptions() { Width = 200, Height = 200, Margin = 0 };
bw.Options = encOptions;
bw.Format = ZXing.BarcodeFormat.QR_CODE;
var image = new Bitmap(bw.Write(Compress(jsonString)));
return image;
}
private static string Compress(string text)
{
byte[] buffer = Encoding.UTF8.GetBytes(text);
var ms = new MemoryStream();
using (var zip = new GZipStream(ms, CompressionMode.Compress, true))
{
zip.Write(buffer, 0, buffer.Length);
}
ms.Position = 0;
byte[] compressed = new byte[ms.Length];
ms.Read(compressed, 0, compressed.Length);
byte[] gzBuffer = new byte[compressed.Length + 4];
System.Buffer.BlockCopy(compressed, 0, gzBuffer, 4, compressed.Length);
System.Buffer.BlockCopy(BitConverter.GetBytes(buffer.Length), 0, gzBuffer, 0, 4);
return Convert.ToBase64String(gzBuffer);
}
Methods used for encoding and decoding
public static FaxReceiver.QrFinder DecodeQrCode(string imagePathToDecode)
{
long userId = 0;
Bitmap bitmapImage = (Bitmap)Image.FromFile(imagePathToDecode);
ZXing.BarcodeReader barcodeReader = new BarcodeReader() { AutoRotate = true, TryHarder = true }; ;
Result decode = barcodeReader.Decode(bitmapImage);
var scanResult = string.Empty;
if (decode != null)
{
scanResult= Decompress(decode.Text);
}
if (!string.IsNullOrWhiteSpace(scanResult))
{
//decrypt Qr received
var decryptedString = DecryptionHelper.Decrypt(scanResult, FaxSetting.IsUseHashing);
//deserialize JSON received
var resultJson = JsonConvert.DeserializeObject<QRJsonFax>(decryptedString);
if (resultJson != null)
{
long.TryParse(resultJson.UserID.ToString(), out userId);
return new QrFinder()
{
FilePath = imagePathToDecode,
UserId = userId,
PageNo = 0,
DataSourceID = resultJson.DataSourceID,
InboundFaxTypeID = resultJson.InboundFaxTypeID
};
}
}
return null;
}
private static string Decompress(string compressedText)
{
byte[] gzBuffer = Convert.FromBase64String(compressedText);
using (var ms = new MemoryStream())
{
int msgLength = BitConverter.ToInt32(gzBuffer, 0);
ms.Write(gzBuffer, 4, gzBuffer.Length - 4);
byte[] buffer = new byte[msgLength];
ms.Position = 0;
using (var zip = new GZipStream(ms, CompressionMode.Decompress))
{
zip.Read(buffer, 0, buffer.Length);
}
return Encoding.UTF8.GetString(buffer);
}
}
File containing Qr code
The problem is that the QR Decoder is getting confused by the gaps between the pixels in your faxed image. If we zoom into a corner of it, this is what we see.
The scanner is looking for solid black squares to identify the QR code.
If we shrink the image by 50%, it becomes readable.
See for yourself at http://zxing.org/w/decode?u=http%3A%2F%2Fi.stack.imgur.com%2FSCYsd.png
I would suggest that after receiving the faxed image, you should either shrink it, or apply a filter to ensure that the QR codes are solid black. You could also look at sending it at a smaller resolution to see if that helps.
I already did a code for print label that is working fine on usps server . I just need to print pdf. How can I do this?
private void BindDetail()
{
//to test the upsp used below code
USPSManager m = new USPSManager("USERID", false);
Package p = new Package();
p.FromAddress.Contact = "John Smith";
p.FromAddress.Address2 = "475 L'Enfant Plaza, SW";
p.FromAddress.City = "Washington";
p.FromAddress.State = "DC";
p.FromAddress.Zip = "20260";
p.FromAddress.ZipPlus4 = "2060";
p.ToAddress.Contact = "Tom Customer";
p.ToAddress.Address1 = "STE 201";
p.ToAddress.Address2 = "6060 PRIMACY PKWY";
p.ToAddress.City = "Memphis";
p.ToAddress.State = "TN";
p.ToAddress.Zip = "20219";
p.ToAddress.ZipPlus4 = "2022";
p.WeightInOunces = 2;
p.ServiceType = ServiceType.Priority;
p.SeparateReceiptPage = false;
p.LabelImageType = LabelImageType.PDF;
p.PackageSize = PackageSize.Regular;
p.PackageType = PackageType.Flat_Rate_Box;
// p.ShippingLabel=
p = m.GetDeliveryConfirmationLabel(p);
}
As you mentioned that you already did the code and you are getting the response form server ; then in Order to print the label you just need to convert GetDeliveryConfirmationLabel to an image, you'll have a file called delivery_confirm.tif you can print that into an image. You can use the following from base64String to image
public Image Base64ToImage(string base64String)
{
// Convert Base64 String to byte[]
byte[] imageBytes = Convert.FromBase64String(base64String);
MemoryStream ms = new MemoryStream(imageBytes, 0,imageBytes.Length);
// Convert byte[] to Image
ms.Write(imageBytes, 0, imageBytes.Length);
Image image = Image.FromStream(ms, true);
return image;
}