Fixed #1922 FLA/XFL/Canvas/SVG export - exporting DefineBitsJPEG3/4 with alpha as JPEG with PNG extension

This commit is contained in:
Jindra Petřík
2022-12-28 08:46:39 +01:00
parent 38b6345fb0
commit 9689f16a4b
7 changed files with 28 additions and 5 deletions

View File

@@ -2425,7 +2425,7 @@ public final class SWF implements SWFContainerItem, Timelined, Openable {
if (ch instanceof ImageTag) {
ImageTag image = (ImageTag) ch;
ImageFormat format = image.getImageFormat();
byte[] imageData = Helper.readStream(image.getImageData());
byte[] imageData = Helper.readStream(image.getConvertedImageData());
String base64ImgData = Helper.byteArrayToBase64String(imageData);
fos.write(Utf8Helper.getBytes("var imageObj" + c + " = document.createElement(\"img\");\r\nimageObj" + c + ".src=\"data:image/" + format + ";base64," + base64ImgData + "\";\r\n"));
}

View File

@@ -119,7 +119,7 @@ public class SVGMorphShapeExporter extends DefaultSVGMorphShapeExporter {
lastPatternId++;
String patternId = "PatternID_" + id + "_" + lastPatternId;
ImageFormat format = image.getImageFormat();
byte[] imageData = Helper.readStream(image.getImageData());
byte[] imageData = Helper.readStream(image.getConvertedImageData());
String base64ImgData = Helper.byteArrayToBase64String(imageData);
path.setAttribute("style", "fill:url(#" + patternId + ")");
Element pattern = exporter.createElement("pattern");

View File

@@ -120,7 +120,7 @@ public class SVGShapeExporter extends DefaultSVGShapeExporter {
lastPatternId++;
String patternId = "PatternID_" + id + "_" + lastPatternId;
ImageFormat format = image.getImageFormat();
byte[] imageData = Helper.readStream(image.getImageData());
byte[] imageData = Helper.readStream(image.getConvertedImageData());
String base64ImgData = Helper.byteArrayToBase64String(imageData);
Element pattern = exporter.createElement("pattern");

View File

@@ -146,7 +146,7 @@ public class ImageImporter extends TagImporter {
}
public void convertImage(ImageTag it, int tagType) throws IOException {
importImage(it, Helper.readStream(it.getImageData()), tagType);
importImage(it, Helper.readStream(it.getConvertedImageData()), tagType);
}
public static int getImageTagType(String format) {

View File

@@ -120,6 +120,26 @@ public abstract class ImageTag extends DrawableTag {
return image;
}
/**
* Gets converted image data. Converted means for example DefineBitsJPEG3 including alpha channel - PNG images
* @return
*/
public InputStream getConvertedImageData() {
if (getImageFormat() == getOriginalImageFormat()) { //no need to convert
InputStream is = getOriginalImageData();
if (is != null) {
return is;
}
}
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageHelper.write(getImage().getBufferedImage(), getImageFormat(), baos);
return new ByteArrayInputStream(baos.toByteArray());
}
/**
* Gets original image data if available, if not, then converted. Original image data can be for example DefineBitsJPEG3 without transparency.
* @return
*/
public InputStream getImageData() {
InputStream is = getOriginalImageData();
if (is != null) {

View File

@@ -43,6 +43,7 @@ import com.jpexs.decompiler.flash.abc.types.traits.TraitMethodGetterSetter;
import com.jpexs.decompiler.flash.amf.amf3.Amf3Value;
import com.jpexs.decompiler.flash.amf.amf3.types.ObjectType;
import com.jpexs.decompiler.flash.configuration.Configuration;
import com.jpexs.decompiler.flash.exporters.ImageExporter;
import com.jpexs.decompiler.flash.exporters.MovieExporter;
import com.jpexs.decompiler.flash.exporters.SoundExporter;
import com.jpexs.decompiler.flash.exporters.commonshape.Matrix;
@@ -1819,7 +1820,7 @@ public class XFLConverter {
}
}
byte[] imageBytes = Helper.readStream(imageTag.getImageData());
byte[] imageBytes = Helper.readStream(imageTag.getConvertedImageData());
SerializableImage image = imageTag.getImageCached();
ImageFormat format = imageTag.getImageFormat();
String symbolFile = "bitmap" + symbol.getCharacterId() + imageTag.getImageFormat().getExtension();