J'utilise une classe personnalisée pour écrire une image sur une autre image de plus grande taille. Voici le plein source code dans DotNetFiddle.Dessiner un bitmap sur un autre produit une image déformée
Ma personnalisation GetPixel()
fonctionne correctement. Mais le SetPixel()
suivant est incapable de produire la sortie appropriée. Probablement, il y a eu quelques problèmes avec le calcul des adresses. Mais, je suis incapable de le détecter.
public void SetPixel(int x, int y, Color color)
{
// Get color components count
int cCount = ColorDepth/8;
// Get start index of the specified pixel
int i = ((y * Width) + x) * cCount;
//int i = ((x * Width) + y) * cCount;
if (ColorDepth == 32) // For 32 bpp set Red, Green, Blue and Alpha
{
_imageData[i] = color.B;
_imageData[i + 1] = color.G;
_imageData[i + 2] = color.R;
_imageData[i + 3] = color.A;
}
if (ColorDepth == 24) // For 24 bpp set Red, Green and Blue
{
_imageData[i] = color.B;
_imageData[i + 1] = color.G;
_imageData[i + 2] = color.R;
}
if (ColorDepth == 8)
{
// For 8 bpp set color value (Red, Green and Blue values are the same)
_imageData[i] = color.B;
string str = string.Empty;
}
}
C'est génère une image déformée:
.
P.S. Voici l'image d'entrée:
.
.
"Indice hors limites" est l'indice que vous obtenez. Il se réfère à '_imageData [i]' et n'a rien à voir avec les pixels Get/Set, sauf qu'il y a un bug dans le code. Puisque le débogueur est déjà actif, prenez le temps d'inspecter la valeur de 'i' et la taille de' _imageData'. – user2864740
Notez également que '(x * Q) + y' ne peut pas être inversé à l'aveugle en tant que' (y * Q) + x' (ils se traduiront par une plage différente), quand 'y! = X'. – user2864740
Essayez de redimensionner l'image en conservant le rapport d'aspect: http://stackoverflow.com/questions/1940581/c-sharp-image-resizing-to-different-size-while-preserving-aspect-ratio –