En este instructivo, se demuestra cómo usar Cloud Run, ImageMagick y la API de Cloud Vision para detectar y difuminar imágenes ofensivas subidas a un bucket de Cloud Storage.
Explora más
Para obtener documentación en la que se incluye esta muestra de código, consulta lo siguiente:
Muestra de código
Go
// blur blurs the image stored at gs://inputBucket/name and stores the result in
// gs://outputBucket/name.
func blur(ctx context.Context, inputBucket, outputBucket, name string) error {
inputBlob := storageClient.Bucket(inputBucket).Object(name)
r, err := inputBlob.NewReader(ctx)
if err != nil {
return fmt.Errorf("NewReader: %v", err)
}
outputBlob := storageClient.Bucket(outputBucket).Object(name)
w := outputBlob.NewWriter(ctx)
defer w.Close()
// Use - as input and output to use stdin and stdout.
cmd := exec.Command("convert", "-", "-blur", "0x8", "-")
cmd.Stdin = r
cmd.Stdout = w
if err := cmd.Run(); err != nil {
return fmt.Errorf("cmd.Run: %v", err)
}
log.Printf("Blurred image uploaded to gs://%s/%s", outputBlob.BucketName(), outputBlob.ObjectName())
return nil
}
Java
// Blurs the file described by blobInfo using ImageMagick,
// and uploads it to the blurred bucket.
public static void blur(BlobInfo blobInfo) throws IOException {
String bucketName = blobInfo.getBucket();
String fileName = blobInfo.getName();
// Download image
Blob blob = storage.get(BlobId.of(bucketName, fileName));
Path download = Paths.get("/tmp/", fileName);
blob.downloadTo(download);
// Construct the command.
List<String> args = new ArrayList<String>();
args.add("convert");
args.add(download.toString());
args.add("-blur");
args.add("0x8");
Path upload = Paths.get("/tmp/", "blurred-" + fileName);
args.add(upload.toString());
try {
ProcessBuilder pb = new ProcessBuilder(args);
Process process = pb.start();
process.waitFor();
} catch (Exception e) {
System.out.println(String.format("Error: %s", e.getMessage()));
}
// Upload image to blurred bucket.
BlobId blurredBlobId = BlobId.of(BLURRED_BUCKET_NAME, fileName);
BlobInfo blurredBlobInfo =
BlobInfo.newBuilder(blurredBlobId).setContentType(blob.getContentType()).build();
try {
byte[] blurredFile = Files.readAllBytes(upload);
Blob blurredBlob = storage.create(blurredBlobInfo, blurredFile);
System.out.println(
String.format("Blurred image uploaded to: gs://%s/%s", BLURRED_BUCKET_NAME, fileName));
} catch (Exception e) {
System.out.println(String.format("Error in upload: %s", e.getMessage()));
}
// Remove images from fileSystem
Files.delete(download);
Files.delete(upload);
}
}
Node.js
// Blurs the given file using ImageMagick, and uploads it to another bucket.
const blurImage = async (file, blurredBucketName) => {
const tempLocalPath = `/tmp/${path.parse(file.name).base}`;
// Download file from bucket.
try {
await file.download({destination: tempLocalPath});
console.log(`Downloaded ${file.name} to ${tempLocalPath}.`);
} catch (err) {
throw new Error(`File download failed: ${err}`);
}
await new Promise((resolve, reject) => {
gm(tempLocalPath)
.blur(0, 16)
.write(tempLocalPath, (err, stdout) => {
if (err) {
console.error('Failed to blur image.', err);
reject(err);
} else {
console.log(`Blurred image: ${file.name}`);
resolve(stdout);
}
});
});
// Upload result to a different bucket, to avoid re-triggering this function.
const blurredBucket = storage.bucket(blurredBucketName);
// Upload the Blurred image back into the bucket.
const gcsPath = `gs://${blurredBucketName}/${file.name}`;
try {
await blurredBucket.upload(tempLocalPath, {destination: file.name});
console.log(`Uploaded blurred image to: ${gcsPath}`);
} catch (err) {
throw new Error(`Unable to upload blurred image to ${gcsPath}: ${err}`);
}
// Delete the temporary file.
const unlink = promisify(fs.unlink);
return unlink(tempLocalPath);
};
Python
# Blurs the given file using ImageMagick.
def __blur_image(current_blob):
file_name = current_blob.name
_, temp_local_filename = tempfile.mkstemp()
# Download file from bucket.
current_blob.download_to_filename(temp_local_filename)
print(f"Image {file_name} was downloaded to {temp_local_filename}.")
# Blur the image using ImageMagick.
with Image(filename=temp_local_filename) as image:
image.resize(*image.size, blur=16, filter="hamming")
image.save(filename=temp_local_filename)
print(f"Image {file_name} was blurred.")
# Upload result to a second bucket, to avoid re-triggering the function.
# You could instead re-upload it to the same bucket + tell your function
# to ignore files marked as blurred (e.g. those with a "blurred" prefix)
blur_bucket_name = os.getenv("BLURRED_BUCKET_NAME")
blur_bucket = storage_client.bucket(blur_bucket_name)
new_blob = blur_bucket.blob(file_name)
new_blob.upload_from_filename(temp_local_filename)
print(f"Blurred image uploaded to: gs://{blur_bucket_name}/{file_name}")
# Delete the temporary file.
os.remove(temp_local_filename)
¿Qué sigue?
Para buscar y filtrar muestras de código para otros productos de Google Cloud, consulta el navegador de muestra de Google Cloud.