nella mia applicazione WinForms che è collegato ad un database tramite LINQ to SQL sto salvataggio delle immagini (sempre * .png) a una tabella che assomiglia a questo:Da dove viene questa perdita di qualità sulle immagini?
CREATE TABLE [dbo].[Images] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[Bild] IMAGE NOT NULL,
PRIMARY KEY CLUSTERED ([Id] ASC)
);
Prima che io possa memorizzare un'immagine devo convertirlo in byte[]
e questo è come lo faccio:
public static byte[] ImageToByteArray(System.Drawing.Image imageIn)
{
using (MemoryStream ms = new MemoryStream())
{
imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
return ms.ToArray();
}
}
Poi se voglio caricare questa stessa immagine in un PictureBox nella mia applicazione converto indietro con questo metodo:
public static Image ByteArrayToImage(byte[] byteArrayIn)
{
using (MemoryStream ms = new MemoryStream(byteArrayIn))
{
Image returnImage = Image.FromStream(ms);
return returnImage;
}
}
In realtà funziona, l'unico problema si presenta quando provo a visualizzare un'immagine dal database in una Picturebox.
Così, quando ho caricare questa immagine al database:
e poi cerco di visualizzarlo. Sembra improvvisamente come questo:
Ho già provato tutte le possibili impostazioni SizeMode per il controllo PictureBox (Normale, Stretchimage, AutoSize, CenterImage, Zoom) e sembra ancora come questo.
Anche ecco come lo caricare le immagini dal database al pictureBox:
Per prima cosa ho recuperare i tutte le immagini appartenenti ad un insieme tramite ID:
public static ImageList GetRezeptImages(int rezeptId)
{
using (CookBookDataContext ctx = new CookBookDataContext(ResourceFile.DBConnection))
{
IEnumerable<RezeptBilder> bilder = from b in ctx.RezeptBilders where b.FKRezept == rezeptId select b;
ImageList imageList = new ImageList();
foreach(RezeptBilder b in bilder)
{
imageList.Images.Add(Helper.ByteArrayToImage(b.Bild.ToArray()));
}
return imageList;
}
}
anche nella mia applicazione devo un datagridview dove ID sono memorizzati nella prima colonna. Così, quando ho voglia di recuperare eventuali immagini che compongono il set lo faccio in questo modo:
private void dgvRezeptListe_CellClick(object sender, DataGridViewCellEventArgs e)
{
pbRezeptBild.Image = DBManager.GetRezeptImages(Int32.Parse(dgvRezeptListe.SelectedRows[0].Cells[0].Value.ToString())).Images[0];
}
volta caricato da una directory locale l'immagine appare bene in pictureBox. Ho anche provato a convertire l'immagine iniziale in binario e viceversa (senza caricarla nel database), sembrava ancora bene quando veniva visualizzata nella pictureBox.
C'è qualcos'altro che ho capito durante il debug dell'immagine proveniente dal database. Quando si guarda a ImageSize, larghezza e altezza avevano entrambi il valore 16. Ciò è strano perché l'immagine originale ha dimensioni completamente diverse.
Qualche idea?
In base a questa fonte: http://msdn.microsoft.com/de-de/library/ms187993.aspx, il tipo di immagine è obsoleto e deve essere sostituito da varbinary. Forse questo impedirà anche la perdita di qualità. – DMAN
Ho appena testato i due metodi di conversione dell'immagine in byte e viceversa, con un DataSet normale, la stessa tabella definita e le procedure memorizzate allegate e non vi è alcuna perdita di qualità dell'immagine. Sembra che il tuo problema potrebbe risiedere in 'LINQ to SQL' –
@DMAN Ci proverò. –