Hace mucho que no escribo nada, no porque haya sufrido muchos tomates y huevos en mis publicaciones anteriores, sino porque realmente no tengo nada real que escribir para referencia de todos. Pero recientemente, cuando estaba ayudando a un amigo con un proyecto, me encontré con un proceso simple de procesamiento de imágenes en Delphi, así que seguí buscando información en Internet y revisando publicaciones csdn anteriores. En los resultados de mi búsqueda, encontré que muchas personas. Me habría encontrado con problemas similares de procesamiento de imágenes en varios proyectos, pero la mayoría de las respuestas parecen estar incompletas (porque muchas de ellas no se han publicado o puede ser una cuestión de hábitos personales. Jaja, espero que después de leer este artículo el mío, todos pueden empezar a trabajar en ello en casa (velocidad posterior al cierre). Así que escribí los problemas y las soluciones que encontré a continuación para su referencia. Al mismo tiempo, puede continuar fabricando ladrillos.
Necesito escribir el problema que quiero resolver antes del contenido formal y también darles a los lectores una buena posición para que no se molesten por mi mal manejo del problema. El principal problema a resolver aquí es rotar la imagen escaneada con el escáner 90 grados en Delphi para obtener una imagen adecuada para su uso, y debido a que el tamaño de la imagen no se puede captar correctamente, la imagen simplemente debe escalarse. Y mi solución se basa completamente en este requisito, porque no pienso mucho en la eficiencia y la claridad después del procesamiento de imágenes, y el beneficio es que el programa parece muy simple.
En primer lugar, no tengo un escáner, por lo que no sé qué formato tiene la imagen obtenida usando el escáner (ya proporcionado), y en la ayuda de Delphi dice "Un mapa de bits es un potente objeto gráfico que se utiliza para crear , manipular (escalar, desplazar, rotar y pintar) y almacenar imágenes en la memoria y como archivos en un disco", por lo que mi primer paso es convertir mis cortes en TBitmap para procesarlos. Mientras convertía el formato, cambié el tamaño real de la imagen para adaptarla a las necesidades de seleccionar posteriormente parte de la imagen. La función es la siguiente:
Procedimiento TMainForm.ChangeImageFormate;
var Mapa de bits: TBitmap;
Zoom: entero;
comenzar
Mapa de bits := TBitmap.Create;//1
intentar
con ImageCert comience
Mapa de bits.Assign(Imagen.Gráfico);//2
Imagen := nula;//3
Zoom := Max(Mapa de bits.Ancho div Ancho,Mapa de bits.Alto div Alto)+1;//4
Ancho := Mapa de bits.Ancho div Zoom;//5
Altura := Mapa de bits.Altura div Zoom;//6
Canvas.StretchDraw(Rect(0,0,Ancho,Alto),Mapa de bits);//7
fin;
finalmente
Mapa de bits.Gratis;
fin;
fin;
Creo que este código no es muy complicado. ImageCert es un control TImage colocado en el formulario. Lo único que puede resultarle desconocido es la octava oración, pero puede obtener muchas explicaciones con la ayuda de Delphi. (Mi consejo es leer más ayuda). Al mismo tiempo, cabe señalar que la tercera frase es muy crítica. Si elimina esta frase y el formato de su imagen no es bmp, aparecerá el error "Solo se puede modificar el mapa de bits".
El segundo paso es realizar la rotación de la imagen, porque el programa solo requiere una rotación de 90 grados cada vez, por lo que aquí es más fácil de manejar. El método de procesamiento es reemplazar según los píxeles. El proceso de implementación es el siguiente:
procedimiento TMainForm.RotateImage;
var x,y: entero;
TmpBitMap: TBitmap;
comenzar
TmpBitMap := TBitmap.Create;
intentar
TmpBitMap.Assign(ImageCert.Picture.Graphic);
con ImageCert comience
Imagen.Bitmap.Height:= TmpBitMap.Width;
Imagen.Bitmap.Width:= TmpBitMap.Height;
para x:=0 a Altura hacer
para y:=0 a Ancho hacer
Canvas.Pixels[TmpBitMap.Height-x,y] := TmpBitMap.Canvas.Pixels[y,x];
Alto: = TmpBitMap.Width;
Ancho := TmpBitMap.Height;
fin;
finalmente
TmpBitMap.Gratis;
fin;
fin;
No hay mucho de qué hablar en este programa, pero las diversas configuraciones de alto y ancho me molestan mucho. Siempre siento que necesito hacer algo más, pero no puedo eliminar ninguna fila. Si alguien está interesado, puede hacerlo. Pruébalo. Lo mejor sería que me dijeras los resultados. Y en este caso, dado que TImage y TBitmap tienen su propio lienzo, puede que valga la pena estudiar cuál usar, pero debido al tiempo limitado, no lo he probado.
En cuanto a parte del proceso de toma de imágenes, utilicé un TShape, luego configuré el estilo del pincel en bsclear y arreglé la posición del TShape en onMouseMove de ImageCert. Esto no es muy sensible porque cuando el mouse está en el TShape no lo hará. tendrá algún efecto, pero afortunadamente el impacto será pequeño. Al mismo tiempo, tomé algunas fotografías bajo TShape en el evento OnMouseDown de TShape. En este momento, si su imagen no ha sido escalada, encontrará que la imagen eliminada no coincide con la posición que vemos (por supuesto, cuando TImage no muestra el tamaño de la imagen correctamente).