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;
}
Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top