Quero converter uma matriz de bytes em uma imagem.
Este é o código do meu banco de dados, de onde obtenho a matriz de bytes:
public void Get_Finger_print()
{
try
{
using (SqlConnection thisConnection = new SqlConnection(@"Data Source=" + System.Environment.MachineName + "\\SQLEXPRESS;Initial Catalog=Image_Scanning;Integrated Security=SSPI "))
{
thisConnection.Open();
string query = "select pic from Image_tbl";// where Name='" + name + "'";
SqlCommand cmd = new SqlCommand(query, thisConnection);
byte[] image =(byte[]) cmd.ExecuteScalar();
Image newImage = byteArrayToImage(image);
Picture.Image = newImage;
//return image;
}
}
catch (Exception) { }
//return null;
}
Meu código de conversão:
public Image byteArrayToImage(byte[] byteArrayIn)
{
try
{
MemoryStream ms = new MemoryStream(byteArrayIn,0,byteArrayIn.Length);
ms.Write(byteArrayIn, 0, byteArrayIn.Length);
returnImage = Image.FromStream(ms,true);//Exception occurs here
}
catch { }
return returnImage;
}
Quando chego à linha com um comentário, ocorre a seguinte exceção: Parameter is not valid.
Como posso corrigir o que está causando essa exceção?
c#
arrays
byte
bytebuffer
Tanzeel ur Rahman
fonte
fonte
Respostas:
Você está gravando no fluxo de memória duas vezes e também não está descartando o fluxo após o uso. Você também está pedindo ao decodificador de imagem para aplicar a correção de cores incorporada.
Em vez disso, tente isto:
fonte
Talvez esteja faltando alguma coisa, mas para mim este one-liner funciona bem com uma matriz de bytes que contém uma imagem de um arquivo JPEG.
EDITAR:
Veja aqui uma versão atualizada desta resposta: Como converter imagem em matriz de bytes
fonte
fonte
Gostaria de observar que há um bug na solução fornecida por @ isaias-b.
Essa solução assume que
stride
é igual ao comprimento da linha. Mas nem sempre é verdade. Devido aos alinhamentos de memória realizados pelo GDI, a passada pode ser maior que o comprimento da linha. Isso deve ser levado em consideração. Caso contrário, uma imagem deslocada inválida será gerada. Os bytes de preenchimento em cada linha serão ignorados.Código fixo:
Para ilustrar a que isso pode levar, vamos gerar uma
PixelFormat.Format24bppRgb
imagem de gradiente 101x101:Se copiarmos todo o array como está para o endereço apontado por
bmpData.Scan0
, obteremos a imagem a seguir. Mudança de imagem porque parte da imagem foi gravada em bytes de preenchimento, que foi ignorado. Também é por isso que a última linha está incompleta:Mas se copiarmos o ponteiro de destino de deslocamento linha por linha por
bmpData.Stride
valor, imagens válidas serão geradas:Stride também pode ser negativo:
Mas não trabalhei com essas imagens e isso está além da minha nota.
Resposta relacionada: C # - Buffer RGB de Bitmap diferente de C ++
fonte
Todas as respostas apresentadas presumem que a matriz de bytes contém dados em uma representação de formato de arquivo conhecida, como: gif, png ou jpg. Mas recentemente tive um problema ao tentar converter
byte[]
s, contendo informações BGRA linearizadas, de forma eficiente emImage
objetos. O código a seguir resolve isso usando umBitmap
objeto.Esta é uma pequena variação de uma solução postada neste site .
fonte
há uma abordagem simples como abaixo, você pode usar o
FromStream
método de uma imagem para fazer o truque, apenas lembre-se de usarSystem.Drawing
;fonte
tentar (ATUALIZAR)
fonte
Você não declarou returnImage como qualquer tipo de variável :)
Isso deve ajudar:
fonte
Isso é inspirado pela resposta de Holstebroe, além de comentários aqui: Obtendo um objeto Image a partir de uma matriz de bytes
fonte
Um liner:
fonte
Na maioria das vezes, quando isso acontece, são dados inválidos na coluna SQL. Esta é a maneira correta de inserir em uma coluna de imagem:
A maioria das pessoas faz isso incorretamente desta forma:
fonte
[SixLabors.ImageSharp] [1] [1]: https://www.nuget.org/packages/SixLabors.ImageSharp
fonte