"format_version": 2, "header": "name": "PNG Import Pack", "description": "Auto-converted from source_image.png", "uuid": "<generated-UUID>", "version": [1, 0, 0], "min_engine_version": [1, 19, 0] , "modules": [ "type": "resources", "uuid": "<generated-UUID-2>", "version": [1, 0, 0] ]
# 3. Generate manifest manifest = create_manifest(input_png, target_block) with open(os.path.join(temp_dir, "manifest.json"), "w") as f: json.dump(manifest, f) png to mcpack converter
The converter accepts an optional mapping.json alongside the PNG, specifying the target texture path. 5. Implementation Architecture A reference Python-based implementation: "") + ".zip"
# 4. Create pack icon pack_icon = img.resize((256, 256)) pack_icon.save(os.path.join(temp_dir, "pack_icon.png")) output_name) Input: logo.png (512x512
png_to_mcpack/ ├── converter.py # Main orchestration ├── manifest_builder.py ├── texture_processor.py ├── packager.py # Zips and renames to .mcpack └── cli.py def convert_png_to_mcpack(input_png, target_block="painting", output_name="output.mcpack"): # 1. Validate PNG img = Image.open(input_png) if not is_power_of_two(img.width) or not is_power_of_two(img.height): img = img.resize(next_power_of_two(img.width), next_power_of_two(img.height)) # 2. Create temp directory temp_dir = create_temp_dir("mcpack_build") textures_dir = os.path.join(temp_dir, "textures") if target_block == "painting": target_dir = os.path.join(textures_dir, "painting") os.makedirs(target_dir) img.save(os.path.join(target_dir, "kz.png")) # replace Aztec painting else: target_dir = os.path.join(textures_dir, "blocks") os.makedirs(target_dir) img.save(os.path.join(target_dir, f"target_block.png"))
| Attribute | Requirement | |-----------|-------------| | Format | PNG (24-bit or 32-bit with transparency) | | Resolution | Power of two (16, 32, 64, 128, 256, 512, 1024) | | Aspect Ratio | Square for blocks/items; rectangle allowed for paintings/entities | | Alpha Channel | Optional (used for transparency on items like glass or icons) |
# 5. Zip to .mcpack shutil.make_archive(output_name.replace(".mcpack", ""), 'zip', temp_dir) os.rename(output_name.replace(".mcpack", "") + ".zip", output_name) Input: logo.png (512x512, company logo with transparency)