Fixed some scaling issues (notably for orientation==3)

This commit is contained in:
Knut Forkalsrud 2010-02-03 19:02:34 -08:00
parent 0adfb5b485
commit f34f3f4c24
10 changed files with 18 additions and 14 deletions

BIN
photos/problemcases/IMG_0046.JPG Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 565 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 560 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 574 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 534 KiB

BIN
photos/problemcases/L1020622.JPG Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 MiB

View file

@ -0,0 +1,5 @@
cover=IMG_e121.JPG
file.IMG_e121.JPG.orientation=1
file.IMG_0046.JPG.orientation=3
file.L1020622.JPG.orientation=6

View file

@ -7,7 +7,6 @@ package org.forkalsrud.album.exif;
/** /**
* TODO (knut - Mar 16, 2008 2:23:56 PM) - add documentation
* *
* @author knut * @author knut
*/ */

View file

@ -28,7 +28,6 @@ import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream; import javax.imageio.stream.ImageInputStream;
import com.drew.imaging.jpeg.JpegMetadataReader; import com.drew.imaging.jpeg.JpegMetadataReader;
import com.drew.imaging.jpeg.JpegProcessingException;
import com.drew.metadata.Directory; import com.drew.metadata.Directory;
import com.drew.metadata.Metadata; import com.drew.metadata.Metadata;
import com.drew.metadata.MetadataException; import com.drew.metadata.MetadataException;
@ -135,27 +134,29 @@ public class DirectoryEntry extends Entry {
Properties loadFromFile(File propFile) throws IOException { Properties loadFromFile(File propFile) throws IOException {
Properties props = new Properties(); Properties props = new Properties();
props.load(new FileInputStream(propFile)); FileInputStream fis = new FileInputStream(propFile);
props.load(fis);
fis.close();
return props; return props;
} }
Properties generateCache() throws MetadataException, JpegProcessingException, IOException, ParseException { Properties generateCache() throws IOException {
long start = System.currentTimeMillis(); long start = System.currentTimeMillis();
Properties props = new Properties(); Properties props = new Properties();
generateFileEntries(props); generateFileEntries(props);
props.store(new FileOutputStream(cache), "Extra Comments"); FileOutputStream fos = new FileOutputStream(cache);
props.store(fos, "Extra Comments");
fos.close();
long end = System.currentTimeMillis(); long end = System.currentTimeMillis();
System.out.println("Time to generate properties for " + file.getPath() + ": " + (end - start)/1000d + " s"); System.out.println("Time to generate properties for " + file.getPath() + ": " + (end - start)/1000d + " s");
return props; return props;
} }
void generateFileEntries(Properties props) void generateFileEntries(Properties props)
throws IOException, MetadataException, JpegProcessingException, ParseException { throws IOException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd-HHmmss");
File[] files = file.listFiles(); File[] files = file.listFiles();
for (File f : files) { for (File f : files) {
@ -174,6 +175,7 @@ public class DirectoryEntry extends Entry {
continue; continue;
} }
if (CACHE_FILE.equals(name) || OVERRIDE_FILE.equals(name)) { if (CACHE_FILE.equals(name) || OVERRIDE_FILE.equals(name)) {
// cache.properties and album.properties
continue; continue;
} }
if (name.endsWith(".jpg") || name.endsWith(".jpeg") || name.endsWith(".JPG")) { if (name.endsWith(".jpg") || name.endsWith(".jpeg") || name.endsWith(".JPG")) {
@ -194,7 +196,7 @@ public class DirectoryEntry extends Entry {
} }
private Map<String, String> generateThumbnailProperties(File f) private Map<String, String> generateThumbnailProperties(File f)
throws JpegProcessingException, MetadataException, IOException { throws IOException {
HashMap<String, String> props = new HashMap<String, String>(); HashMap<String, String> props = new HashMap<String, String>();
String name = f.getName(); String name = f.getName();
boolean hasDate = false; boolean hasDate = false;
@ -283,6 +285,7 @@ public class DirectoryEntry extends Entry {
reader.setInput(iis, true); reader.setInput(iis, true);
ImageReadParam param = reader.getDefaultReadParam(); ImageReadParam param = reader.getDefaultReadParam();
BufferedImage img = reader.read(0, param); BufferedImage img = reader.read(0, param);
iis.close();
return new Dimension(img.getWidth(), img.getHeight()); return new Dimension(img.getWidth(), img.getHeight());
} }

View file

@ -186,7 +186,6 @@ public class PictureScaler {
// The first four are obtained with only flipping X and/or Y // The first four are obtained with only flipping X and/or Y
// The last four are obtained by rotating 90 degrees and then flipping X and/or Y. // The last four are obtained by rotating 90 degrees and then flipping X and/or Y.
// //
// TODO: Flipping here completely forgets to translate accordingly, so for example rotation id 3 becomes completely messed up.
double[] flipX = new double[] { +1, -1, -1, +1, -1, +1, +1, -1 }; double[] flipX = new double[] { +1, -1, -1, +1, -1, +1, +1, -1 };
double[] flipY = new double[] { +1, +1, -1, -1, +1, +1, -1, -1 }; double[] flipY = new double[] { +1, +1, -1, -1, +1, +1, -1, -1 };
@ -197,8 +196,8 @@ public class PictureScaler {
AffineTransform xform = new AffineTransform(); AffineTransform xform = new AffineTransform();
boolean rotate = idx >= 4; boolean rotate = idx >= 4;
if (rotate) {
xform.translate(intermediate.getWidth() / 2d, intermediate.getHeight() / 2d); xform.translate(intermediate.getWidth() / 2d, intermediate.getHeight() / 2d);
if (rotate) {
xform.rotate(Math.PI / 2); xform.rotate(Math.PI / 2);
scale = (double)intermediate.getHeight() / img.getWidth(); scale = (double)intermediate.getHeight() / img.getWidth();
} else { } else {
@ -206,9 +205,7 @@ public class PictureScaler {
} }
xform.scale(scale, scale); xform.scale(scale, scale);
xform.scale(flipX[idx], flipY[idx]); xform.scale(flipX[idx], flipY[idx]);
if (rotate) {
xform.translate(-img.getWidth() / 2d, -img.getHeight() / 2d); xform.translate(-img.getWidth() / 2d, -img.getHeight() / 2d);
}
int imgType = img.getType(); int imgType = img.getType();
BufferedImage buf2 = new BufferedImage(intermediate.getWidth(), intermediate.getHeight(), imgType); BufferedImage buf2 = new BufferedImage(intermediate.getWidth(), intermediate.getHeight(), imgType);