Estou fazendo um aplicativo de compartilhamento de área de trabalho remota em que capturo uma imagem da área de trabalho e a comprimo e envio para o receptor. Para compactar a imagem, preciso convertê-la em um byte [].
Atualmente estou usando este:
public byte[] imageToByteArray(System.Drawing.Image imageIn)
{
MemoryStream ms = new MemoryStream();
imageIn.Save(ms,System.Drawing.Imaging.ImageFormat.Gif);
return ms.ToArray();
}
public Image byteArrayToImage(byte[] byteArrayIn)
{
MemoryStream ms = new MemoryStream(byteArrayIn);
Image returnImage = Image.FromStream(ms);
return returnImage;
}
Mas eu não gosto porque tenho que salvá-lo em um ImageFormat e isso também pode usar recursos (Slow Down), bem como produzir resultados de compactação diferentes. Eu li sobre como usar Marshal.Copy e memcpy, mas não consigo compreendê-los.
Então, existe algum outro método para atingir esse objetivo?
MemoryStream
; é um recurso totalmente gerenciado, a menos que você o esteja usando em comunicação remota. Em ambos os casos, seria inapropriado dispor do recurso.Respostas:
Não. Para converter uma imagem para um array de bytes que você tem para especificar um formato de imagem - assim como você tem que especificar uma codificação quando você converter texto em um array de bytes.
Se você está preocupado com artefatos de compressão, escolha um formato sem perdas. Se você está preocupado com os recursos da CPU, escolha um formato que não se incomode em compactar - apenas pixels ARGB brutos, por exemplo. Mas é claro que isso levará a uma matriz de bytes maior.
Note que se você escolher um formato que faz incluem compressão, não há nenhum ponto em seguida, comprimindo a matriz de bytes depois - é quase certo que não têm nenhum efeito benéfico.
fonte
imageIn.RawFormat
qual tenta salvar os bytes da imagem bruta sem mais recodificação.Existe uma propriedade RawFormat do parâmetro Image que retorna o formato de arquivo da imagem. Você pode tentar o seguinte:
fonte
myObject.Dispose()
ouusing(myObject){}
- ambos fazem a mesma coisa, mas a instrução using basicamente cria um escopo que limpará para você.Não tenho certeza se você terá grandes ganhos pelos motivos apontados por Jon Skeet. No entanto, você pode tentar comparar o método TypeConvert.ConvertTo e ver como ele se compara ao uso do método atual.
fonte
fonte
fonte
A maneira mais rápida de descobrir é esta:
Espero ser útil
fonte
System.Windows.Controls.Image
objetos. Se você quiser converter um desses para bytes e passá-lo para esta linha comoInputImg
, isso não funcionará. Ele espera umSystem.Drawing.Image
objeto.