Por que eu preciso para especificar uma resolução para cortar?
-
05-07-2019 - |
Pergunta
Eu escrevi um método para cortar imagens em C #. Fá-lo através da criação de um novo bitmap e desenhar nele um retângulo especificado (a área a ser cortada) a partir da imagem original.
Para as imagens que eu tentei com ele estava gerando resultados errados. O tamanho da imagem resultante era certo, mas o conteúdo era ele. Era como se a imagem tenha sido ampliada por 2 e então cortada. Eventualmente adicionando esta linha fixa-lo:
result.setResolution(72, 72)
Mas por que eu preciso uma resolução? Eu só estou trabalhando com pixels, não com polegadas ou centímetros. Além disso, qual seria então a resolução correcta?
O código completo é este método de extensão:
public static Bitmap Crop(this Image image, int x, int y, int width, int height) {
Bitmap result = new Bitmap(width, height);
result.SetResolution(72, 72);
// Use a graphics object to draw the resized image into the bitmap.
using (Graphics graphics = Graphics.FromImage(result)) {
// High quality.
graphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
// Draw the image into the target bitmap.
graphics.DrawImage(image, 0, 0, new Rectangle(x, y, width, height), GraphicsUnit.Pixel);
}
return result;
}
Solução
Você está usando a sobrecarga incorreta de DrawImage. Você deve estar usando aquele onde você especificar o Src e rects Dest.
graphics.DrawImage(image, new Rectangle(0, 0, width, height), new Rectangle(x, y, width, height), GraphicsUnit.Pixel);
Tente isso e me deixe saber nos comentários se ele não funciona.
Outras dicas
i suspeitar as mentiras resposta na forma como a biblioteca realmente faz a modificação. ele apenas copia e cola em torno de alguns blocos de memória. especifica a resolução do número de bits / bytes usados ??por pixel. a fim de saber quantos bytes ele precisa para copiar, ele precisa saber quantos bits / bytes por pixel é usado.
Portanto, eu acho que isso é uma simples multiplicação seguido por um memcopy.
relação