Skip to content

Commit fa0ddb8

Browse files
fix/few-error-handling-items-for-bitmap-collage-and-zero-byte-files
1 parent 94037ce commit fa0ddb8

2 files changed

Lines changed: 37 additions & 13 deletions

File tree

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ With the following arguments meaning:
2020
```
2121
## Changelog
2222
```
23+
08/04/2026 3.05 Added support for old bitmap data in BMCache files.
2324
01/12/2023 3.04 Fix memory usage for huge speed improvement
2425
15/05/2023 3.03 Added KAPE output to split output into seperate folders
2526
02/03/2023 3.02 Added destination folder existence check beforehand.

bmc-tools.py

Lines changed: 36 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -350,14 +350,20 @@ def b_export(self, dname):
350350
self.bmps.append(pad*64*64)
351351
w = self.STRIPE_WIDTH*64
352352
h*=len(self.bmps)//self.STRIPE_WIDTH
353-
c_bmp = b"" if not self.pal else self.PALETTE
354-
if self.btype == self.BIN_CONTAINER:
355-
collage_builder = (lambda x, a=self, PAD=len(pad), WIDTH=range(w // 64): b''.join([b''.join([a.bmps[a.STRIPE_WIDTH*(x+1)-1-k][64*PAD*j:64*PAD*(j+1)] for k in WIDTH]) for j in range(64)]))
353+
if len(self.bmps) == 0 or len(self.bmps) < self.STRIPE_WIDTH:
354+
self.b_log(sys.stdout, False, 1, "Not enough files to build collage with default collage -WIDTH of %d" % (self.STRIPE_WIDTH))
356355
else:
357-
collage_builder = (lambda x, a=self, PAD=len(pad), WIDTH=range(w // 64): b''.join([b''.join([a.bmps[a.STRIPE_WIDTH*x+k][64*PAD*j:64*PAD*(j+1)] for k in WIDTH]) for j in range(64)]))
358-
c_bmp += b''.join(map(collage_builder, range(h//64)))
359-
self.b_write(os.path.join(dname, "%s_collage.bmp" % (self.fname)), self.b_export_bmp(w, h, c_bmp))
360-
self.b_log(sys.stdout, False, 0, "Successfully exported collage file.")
356+
try:
357+
c_bmp = b"" if not self.pal else self.PALETTE
358+
if self.btype == self.BIN_CONTAINER:
359+
collage_builder = (lambda x, a=self, PAD=len(pad), WIDTH=range(w // 64): b''.join([b''.join([a.bmps[a.STRIPE_WIDTH*(x+1)-1-k][64*PAD*j:64*PAD*(j+1)] for k in WIDTH]) for j in range(64)]))
360+
else:
361+
collage_builder = (lambda x, a=self, PAD=len(pad), WIDTH=range(w // 64): b''.join([b''.join([a.bmps[a.STRIPE_WIDTH*x+k][64*PAD*j:64*PAD*(j+1)] for k in WIDTH]) for j in range(64)]))
362+
c_bmp += b''.join(map(collage_builder, range(h//64)))
363+
self.b_write(os.path.join(dname, "%s_collage.bmp" % (self.fname)), self.b_export_bmp(w, h, c_bmp))
364+
self.b_log(sys.stdout, False, 0, "Successfully exported collage file.")
365+
except IndexError:
366+
self.b_log(sys.stdout, False, 1, "Not enough files to build collage with default collage -WIDTH of %d" % (self.STRIPE_WIDTH))
361367
return True
362368
def b_export_bmp(self, width, height, data):
363369
if not self.pal:
@@ -375,7 +381,7 @@ def b_flush(self):
375381
return True
376382

377383
if __name__ == "__main__":
378-
prs = argparse.ArgumentParser(description="RDP Bitmap Cache parser (v. 3.04, 2023/12/02)")
384+
prs = argparse.ArgumentParser(description="RDP Bitmap Cache parser (v. 3.05, 2026/08/04)")
379385
prs.add_argument("-s", "--src", help="Specify the BMCache file or directory to process.", required=True)
380386
prs.add_argument("-d", "--dest", help="Specify the directory where to store the extracted bitmaps.", required=True)
381387
prs.add_argument("-c", "--count", help="Only extract the given number of bitmaps.", type=int, default=-1)
@@ -396,18 +402,35 @@ def b_flush(self):
396402
for root, dirs, files in os.walk(args.src):
397403
for f in files:
398404
if f.rsplit(".", 1)[-1].upper() in ["BIN", "BMC"]:
399-
if args.verbose:
400-
sys.stdout.write("[---] File '%s' has been found.%s" % (os.path.join(root, f), os.linesep))
401-
src_files.append(os.path.join(root, f))
405+
file_path = os.path.join(root, f)
406+
try:
407+
file_size = os.path.getsize(file_path)
408+
except OSError:
409+
file_size = 0
410+
if file_size > 0:
411+
if args.verbose:
412+
sys.stdout.write("[---] File '%s' has been found.%s" % (file_path, os.linesep))
413+
src_files.append(file_path)
414+
else:
415+
sys.stdout.write("[!!!] File '%s' is zero bytes, skipping file.%s" % (file_path, os.linesep))
402416
if len(src_files) == 0:
403417
sys.stderr.write("No suitable files were found under '%s' directory.%s" % (args.src, os.linesep))
404418
exit(-1)
405419
elif not os.path.isfile(args.src):
406420
sys.stderr.write("Invalid -s/--src parameter; use -h/--help for help.%s" % (os.linesep))
407421
exit(-1)
408422
else:
409-
sys.stdout.write("[+++] Processing a single file: '%s'.%s" % (args.src, os.linesep))
410-
src_files.append(args.src)
423+
file_size = 0
424+
try:
425+
file_size = os.path.getsize(args.src)
426+
except OSError:
427+
file_size = 0
428+
if file_size > 0:
429+
sys.stdout.write("[+++] Processing a single file: '%s'.%s" % (args.src, os.linesep))
430+
src_files.append(args.src)
431+
else:
432+
sys.stdout.write("[!!!] File '%s' is Zero-Bytes.%s" % (args.src, os.linesep))
433+
411434
for src in src_files:
412435
sys.stdout.write("[+++] Processing a file: '%s'.%s" % (src, os.linesep))
413436
if bmcc.b_import(src):

0 commit comments

Comments
 (0)